我在python的输出中遇到负零;例如,它的创建如下:

k = 0.0
print(-k)


输出将是-0.0

但是,当我将-k与0.0比较是否相等时,它会得出True。 0.0-0.0之间有什么区别(我不在乎它们可能具有不同的内部表示形式;我只关心它们在程序中的行为。)是否有任何我应该注意的隐藏陷阱?

最佳答案

查看−0 (number) in Wikipedia

基本上,IEEE实际上定义了一个负零。

并通过此定义用于所有目的:

-0.0 == +0.0 == 0


我同意aaronasterling的观点,即-0.0+0.0是不同的对象。使它们相等(相等运算符)可确保代码中没有引入细微的错误。
想想a * b == c * d

>>> a = 3.4
>>> b =4.4
>>> c = -0.0
>>> d = +0.0
>>> a*c
-0.0
>>> b*d
0.0
>>> a*c == b*d
True
>>>




[编辑:基于评论的更多信息]

当我出于所有实际目的发言时,我相当匆忙地选择了该词。我的意思是标准相等性比较。

如参考文献所述,IEEE标准定义了比较,以便使用+0 = -0而不是-0 < +0。尽管总有可能忽略零的符号,但IEEE标准并未这样做。当乘法或除法涉及带符号的零时,通常的符号规则适用于计算答案的符号。

divmodatan2之类的操作都表现出这种现象。实际上,具有IEEE定义的atan2 complies以及基础的“ C”库也是如此。

>>> divmod(-0.0,100)
(-0.0, 0.0)
>>> divmod(+0.0,100)
(0.0, 0.0)

>>> math.atan2(0.0, 0.0) == math.atan2(-0.0, 0.0)
True
>>> math.atan2(0.0, -0.0) == math.atan2(-0.0, -0.0)
False


一种方法是从文档中找出实现是否符合IEEE行为。从讨论中还可以看出,平台也有细微的变化。

但是,这个方面(符合IEEE定义)并未在任何地方得到尊重。看到由于不感兴趣而拒绝PEP 754!我不确定以后是否会收到。

另请参见What Every Computer Scientist Should Know About Floating-Point Arithmetic

关于python - python中的负零,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55360206/

10-10 23:20