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.
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)
也许更直接的演示是注意到x并x + 1在转换为浮点时产生相同的值:
In [11]: float(x) == float(x + 1)
Out[11]: True
Run Code Online (Sandbox Code Playgroud)
float(x + 1)是一样的float(x),所以fmod不返回你期望的值也就不足为奇了.
| 归档时间: |
|
| 查看次数: |
263 次 |
| 最近记录: |