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

时间:2015-11-29 15:23:32

标签: python python-3.x math

我得到以下内容:

>>> 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。

1 个答案:

答案 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

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

In [11]: float(x) == float(x + 1)
Out[11]: True

float(x + 1)float(x)相同,因此fmod不会返回您期望的值也就不足为奇了。