我在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标准并未这样做。当乘法或除法涉及带符号的零时,通常的符号规则适用于计算答案的符号。divmod
和atan2
之类的操作都表现出这种现象。实际上,具有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/