python - 为什么 -0.0 与 0.0 不同?

标签 python math floating-point

我可能遗漏了一些基本的东西,但考虑一下这个解释器 session 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
>>>

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

>>> 1.3 + 0.1
1.4000000000000001
>>>

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


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

最佳答案

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

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

>>> 1999+1 is 2000
False

>>> 0.0 == -0.0
True

关于python - 为什么 -0.0 与 0.0 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26764972/

相关文章:

Python 字典自带一个额外的大括号,作为 JSON 键,通过 HttpResponse

python - 没有 Scipy 或 Numpy 的 Python 中的多项式乘法

math - 使用三次贝塞尔曲线作为直线 : where do the control points have to be located to get equidistant spacing for t

python - 以正常形式打印 float ,而不是指数形式/科学记数法

python - 检查 scipy 稀疏矩阵条目是否存在

python - 如何将此 XML 解析为 python 数组或字典?

javascript数学函数: Right now it forms a circle,我需要做一个半圆

c++ - 内存中的浮点表示对我来说不清楚

python - 浮点表示的模拟

python - 计算 pandas DF 列子集的均值或方差