python中的负零
我在python的输出中遇到了负零;例如,它创建如下:python中的负零,python,floating-point,floating-accuracy,zero,Python,Floating Point,Floating Accuracy,Zero,我在python的输出中遇到了负零;例如,它创建如下: k = 0.0 print(-k) 输出将为-0.0 然而,当我将-k与0.0进行相等性比较时,它得到了True。0.0和-0.0之间有什么区别吗(我不在乎它们可能有不同的内部表示;我只关心它们在程序中的行为。)我应该知道有什么隐藏的陷阱吗?是的,0.0和-0.0之间有区别(尽管Python不允许我复制它:-p)。如果你把一个正数除以0.0,你得到正无穷大;如果你把这个数字除以-0.0,你得到负无穷大 不过,除此之外,这两个值之间并没有实
k = 0.0
print(-k)
输出将为-0.0
然而,当我将
-k
与0.0进行相等性比较时,它得到了True。0.0
和-0.0
之间有什么区别吗(我不在乎它们可能有不同的内部表示;我只关心它们在程序中的行为。)我应该知道有什么隐藏的陷阱吗?是的,0.0和-0.0之间有区别(尽管Python不允许我复制它:-p)。如果你把一个正数除以0.0,你得到正无穷大;如果你把这个数字除以-0.0,你得到负无穷大
不过,除此之外,这两个值之间并没有实际差异。请查看
基本上,IEEE确实定义了负零
根据本定义,出于所有目的:
-0.0 == +0.0 == 0
我同意-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
这样的操作都表现出这种行为。事实上,atan2
与IEEE定义相同,底层的“C”库也是如此
一种方法是通过文档了解实现是否符合IEEE行为。从讨论中还可以看出,平台也存在细微的变化
然而,这一方面(IEEE定义合规性)并没有在任何地方得到尊重。看到因不感兴趣而被拒绝!我不确定这是不是后来被发现的
另请参见。它使功能有所不同(至少在某些实现中)。在我的Windows上的Python 3.1和3.2中(根据下面的注释CPython实现详细信息,它基于底层C实现):
相同的值,但不同的数字
>>> Decimal('0').compare(Decimal('-0')) # Compare value
Decimal('0') # Represents equality
>>> Decimal('0').compare_total(Decimal('-0')) # Compare using abstract representation
Decimal('1') # Represents a > b
参考资料:以不同的方式对待
-0.0
和+0.0
,除非您在一个奇怪的平台上运行Python:
数学。
copysign(x,y)返回带有y符号的x。在支持带符号零的平台上,
copysign(1.0,-0.0)
返回-1.0
你不能除以0。如果你说的是极限,-0就更没有意义了,-1你不能对数字0进行除法,因为你得到了一个零除数误差。这意味着没有区别。@falmari:在Python中,你不能;在其他语言中,你也可以。我在处理0.0和-0.0之间的区别时使用了一般的浮点处理方法。+1抵消了下行投票。Chris是正确的,例如,在C中,浮点除以0.0被定义为产生符号为的无穷大(分子和分母有相同的符号)?肯定:否定。@DMan:重要的是,(a)它们存在,(b)有一个实现。(即使是局部的。)因为你(和我)看不到复杂的数学微妙之处并不意味着什么。它们仍然存在。我不懂偏微分方程,看不出有什么实用价值。有些人喜欢。我认为该标准的实用价值有限。这不是重点。我对“实用”的拙见毫无价值。它仍然存在,仍然有意义,并且仍然部分实现。@aaronasterling:你为什么删除你的答案?这是对这里信息的宝贵补充。我只是对它投了更高的票。因为我对它的最后一部分错了,而它的其余部分并不是我的帖子所独有的。如果它“在所有方面都是平等的”,那么它如何解释Craig McQueen回答中的
atan2
的差异呢?我同意当比较相等时它返回True,但是如果两个数字的行为可能不同,我想知道什么时候。@max注意,反正切函数基本上是在寻找所提供参数的斜率(和方向),所以在内部它被零除,导致不连续,这应该不会令人惊讶。此外,函数输出是循环的,周期为2π,+π和-π是“相同的”。python 2.5.4不会给出负值。真正的隐藏陷阱是当您开始测试浮点值是否相等时。它们是不精确的,并且容易出现奇怪的舍入差异。但它确实在Python2.7.1上打印负值;在子午线稍西边的经度被报告为零度和x分钟,而它本应为负零度和x分钟。但是python不能表示整数负零。numpy还有一个copysign。耶!
>>> import math
>>> math.atan2(0.0, 0.0)
0.0
>>> math.atan2(-0.0, 0.0)
-0.0
>>> math.atan2(0.0, -0.0)
3.141592653589793
>>> math.atan2(-0.0, -0.0)
-3.141592653589793
>>> Decimal('0').compare(Decimal('-0')) # Compare value
Decimal('0') # Represents equality
>>> Decimal('0').compare_total(Decimal('-0')) # Compare using abstract representation
Decimal('1') # Represents a > b
>>> import math
>>> math.copysign(1, -0.0)
-1.0
>>> math.copysign(1, 0.0)
1.0