我得到以下内容:
>>> x=1234567890123456789012345678
>>> odd = x + 1
>>> odd
1234567890123456789012345679
>>> math.fmod(x, 2)
0.0
>>> math.fmod(odd, 2)
0.0
>>> odd % 2
1
math.fmod(odd, 2)
是否有问题?
根据this,math.fmod(x,y)是:
返回
fmod(x, y)
,由平台C库定义。请注意,Python表达式x % y
可能不会返回相同的结果。 C标准的目的是fmod(x,y)对于某些整数n,精确地(数学地;到无限精度)等于x - n*y
,使得结果具有与x相同的符号,并且小于{{ 1}}。
以上听起来像math.fmod(x,y)应该返回x modulo y。
答案 0 :(得分:7)
C函数fmod
适用于双精度(即64位)浮点值。 Python必须在调用fmod
之前将参数转换为双精度浮点数。您的x
无法完全表示为此类浮点值。对于大的数字,“最小精度单位”(ULP)大于1。快速检查一下:
In [3]: x = 1234567890123456789012345678
In [4]: fx = 1.0*x
In [5]: fx
Out[5]: 1.2345678901234569e+27
In [6]: fx + 1
Out[6]: 1.2345678901234569e+27
In [7]: fx + 1 == fx
Out[7]: True
或许更直接的演示是注意x
和x + 1
在转换为浮点时会产生相同的值:
In [11]: float(x) == float(x + 1)
Out[11]: True
float(x + 1)
与float(x)
相同,因此fmod
不会返回您期望的值也就不足为奇了。