为什么-0.0与0.0不一样?

时间:2014-11-05 19:00:26

标签: python math floating-point

我可能会遗漏一些基本的东西,但请考虑这个解释器会话 1

>>> -0.0 is 0.0
False
>>> 0.0 is 0.0
True
>>> -0.0  # The sign is even retained in the output.  Why?
-0.0
>>>

你会认为Python解释器会意识到-0.00.0是相同的数字。事实上,它将它们视为相等:

>>> -0.0 == 0.0
True
>>>

那么为什么Python会区分这两者并为-0.0生成一个全新的对象?它没有用整数做到这一点:

>>> -0 is 0
True
>>> -0  # Sign is not retained
0
>>>

现在,我意识到浮点数是计算机问题的一个重要原因,但这些问题总是与它们的准确性有关。例如:

>>> 1.3 + 0.1
1.4000000000000001
>>>

但这不是一个准确性问题,是吗?我的意思是,我们在这里谈的是数字的符号,而不是小数位。


1 我可以在Python 2.7和Python 3.4中重现这种行为,因此这不是版本特定的问题。

3 个答案:

答案 0 :(得分:12)

在IEEE754中,浮点数的格式,符号是一个单独的位。所以-0.0和0.0因此而不同。 整数使用二进制补码表示负数;这就是为什么只有一个0

仅使用is您真正想要比较对象的实例。否则,尤其是对于数字,请使用==

>>> 1999+1 is 2000
False

>>> 0.0 == -0.0
True

答案 1 :(得分:8)

IEEE浮点运算标准(IEEE 754)定义了signed zeroes的包含。理论上,它们允许您区分负数下溢和正数underflow

就python而言,使用==而不是is来比较数字。

答案 2 :(得分:4)

因为这两个数字的二进制表示不同。在0.0中,第32位为0,在-0.0中,第32位为1.