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)