楼层功能错误

时间:2017-01-26 16:28:29

标签: python

floor(-1e-14 % 2)
Out[1]: 1.0

floor(-1e-16 % 2)
Out[2]: 2.0

我知道-1e-16可能距离0太近了,但% 2操作后的楼层结果绝对不应该是2(0或1)!

2 个答案:

答案 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。哪种方法更合适取决于应用程序。