为什么`n%int(m)!= n%float(m)?

问题描述 投票:0回答:3

为什么对于具有相同分频器的相同数字,模数仅以floatint表示?或者例如为什么10**23 % int(9)!= 10**23 % float(9)

for i in range(1, 30):
   print(i, 10**i % 9, 10**i % 9.0)

输出:

1 1 1.0
2 1 1.0
3 1 1.0
4 1 1.0
5 1 1.0
6 1 1.0
7 1 1.0
8 1 1.0
9 1 1.0
10 1 1.0
11 1 1.0
12 1 1.0
13 1 1.0
14 1 1.0
15 1 1.0
16 1 1.0
17 1 1.0
18 1 1.0
19 1 1.0
20 1 1.0
21 1 1.0
22 1 1.0
23 1 5.0    <--- Why?  10**23 % 9 != 10**23 % 9.0
24 1 0.0    And so on in no particular order.
25 1 1.0
26 1 6.0
27 1 1.0
28 1 2.0
29 1 1.0

Python 3.8.1

python modulus
3个回答
4
投票

要执行10**23%9.0,值10**23将转换为浮点数。浮点数是近似值。如果将10**23表示为浮点数,则实际获得的值与精确值有很大的距离。

>>> x = float(10**23)
>>> int(x)
99999999999999991611392

0
投票

浮点精度错误。随着距离零的增加,浮点数将失去一位数的精度,这就是模数所显示的。

我们可以通过将大int 10**i转换为浮点数并返回,并将其与原始int值进行比较来证明这一点:

>>> for i in range(1, 30):
...    print(i, 10**i, int(float(10**i)) - 10**i)
... 
1 10 0
2 100 0
3 1000 0
4 10000 0
5 100000 0
6 1000000 0
7 10000000 0
8 100000000 0
9 1000000000 0
10 10000000000 0
11 100000000000 0
12 1000000000000 0
13 10000000000000 0
14 100000000000000 0
15 1000000000000000 0
16 10000000000000000 0
17 100000000000000000 0
18 1000000000000000000 0
19 10000000000000000000 0
20 100000000000000000000 0
21 1000000000000000000000 0
22 10000000000000000000000 0
23 100000000000000000000000 -8388608
24 1000000000000000000000000 -16777216
25 10000000000000000000000000 905969664
26 100000000000000000000000000 4764729344
27 1000000000000000000000000000 13287555072
28 10000000000000000000000000000 -416880263168
29 100000000000000000000000000000 -8566849142784

0
投票

浮点精度。当您对浮点数进行模数运算时,该值将转换为浮点数,并且10 ^ 23恰好大于浮点数可以自然表示的值。我们可以使用Decimal确切地看到正在发生的事情:

>>> from decimal import Decimal
>>> (sign, mantissa, exponent) = Decimal(10**23).as_tuple()
>>> sign, mantissa, exponent
(0, (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 0)
>>> (sign, mantissa, exponent) = Decimal(float(10**23)).as_tuple()
>>> sign, mantissa, exponent
(0, (9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 6, 1, 1, 3, 9, 2), 0)
© www.soinside.com 2019 - 2024. All rights reserved.