为什么-0.0与0.0不一样?

iCo*_*dez 6 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
>>>
Run Code Online (Sandbox Code Playgroud)

你会认为Python解释器会实现这个-0.0并且0.0是相同的数字.事实上,它将它们视为相等:

>>> -0.0 == 0.0
True
>>>
Run Code Online (Sandbox Code Playgroud)

那么为什么Python会区分这两者并生成一个全新的对象-0.0呢?它不会用整数执行此操作:

>>> -0 is 0
True
>>> -0  # Sign is not retained
0
>>>
Run Code Online (Sandbox Code Playgroud)

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

>>> 1.3 + 0.1
1.4000000000000001
>>>
Run Code Online (Sandbox Code Playgroud)

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


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

Dan*_*iel 12

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

is只使用你真的想要比较对象的实例.否则,特别是对于数字,使用==:

>>> 1999+1 is 2000
False

>>> 0.0 == -0.0
True
Run Code Online (Sandbox Code Playgroud)

  • @iCodez:有符号零对于复杂数学函数的实现很有用.规范性的论文是:威廉卡汉,复杂基本功能的分支削减,或关于无符号位的很多.In:数值分析的最新进展,Clarendon Press,牛津,1987年.通过Google Scholar轻松找到在线副本. (7认同)

khe*_*ood 8

IEEE浮点运算标准(IEEE 754)定义了有符号零的包含.理论上,它们允许您区分负数下溢和正数下溢.

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