math.fmod的精度是否高于%?

Old*_*zer 0 python math python-3.x

我得到以下内容:

>>> x=1234567890123456789012345678
>>> odd = x + 1
>>> odd
1234567890123456789012345679
>>> math.fmod(x, 2)
0.0
>>> math.fmod(odd, 2)
0.0
>>> odd % 2
1
Run Code Online (Sandbox Code Playgroud)

有什么问题math.fmod(odd, 2)吗?

根据这个,math.fmod(x,y)是:

返回fmod(x, y),由平台C库定义.请注意,Python表达式x % y可能不会返回相同的结果.C标准的目的是使fmod(x,y)完全(数学上;到无限精度)等于x - n*y某个整数n,使得结果具有与x相同的符号和小于的数量abs(y).

上面的声音像math.fmod(x,y)应该返回x modulo y.

War*_*ser 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
Run Code Online (Sandbox Code Playgroud)

也许更直接的演示是注意到xx + 1在转换为浮点时产生相同的值:

In [11]: float(x) == float(x + 1)
Out[11]: True
Run Code Online (Sandbox Code Playgroud)

float(x + 1)是一样的float(x),所以fmod不返回你期望的值也就不足为奇了.

  • Python处理非常大的整数!只是不要将它们传递给`fmod`. (2认同)