floor(-1e-14 % 2)
Out[1]: 1.0
floor(-1e-16 % 2)
Out[2]: 2.0
我知道-1e-16
可能距离0
太近了,但% 2
操作后的楼层结果绝对不应该是2(0或1)!
答案 0 :(得分:6)
这不是地板上的错误。检查%
In [61]: -1e-16 % 2
Out[61]: 2.0
In [62]: -1e-14 % 2
Out[62]: 1.99999999999999
您可以阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic以了解%
行为的原因。
decimal模块支持十进制浮点运算。它比foat数据类型具有几个优点。因此,对于浮点值的精确数学
<强> sys.float_info 强>
有关浮动类型的详细信息,可以使用sys.flaot_info
。
sys.float_info.dig
显示可以在浮点数中忠实表示的最大小数位数;对于包含具有更多数字的值的计算,您可能不会期望具有给定精度的准确结果
这就是我所拥有的
In [217]: import sys
In [218]: sys.float_info.dig
Out[218]: 15
答案 1 :(得分:2)
你是对的,-1e-16
的结果不应该是2.0
,但漂浮物很奇怪,并且臭名昭着不精确。 %
运算符states的规范:
而abs(x%y)&lt; abs(y)在数学上是正确的,对于浮点数,由于舍入,它可能不是真正的数字。例如,假设一个Python浮点数是IEEE 754双精度数的平台,为了使-1e-100%1e100与1e100具有相同的符号,计算结果为-1e-100 + 1e100,这是在数字上完全等于1e100。函数math.fmod()返回一个符号与第一个参数的符号匹配的结果,因此在这种情况下返回-1e-100。哪种方法更合适取决于应用程序。