python中的负数为零

[Python 3.1]

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

k = 0.0 print(-k) 

输出将是-0.0

但是,当我将-k与0.0进行比较时,它会生成True。 在0.0-0.0之间有什么区别吗(我不在意他们大概有不同的内部performanceforms,我只关心他们在程序中的行为)有没有我应该知道的隐藏的陷阱?

检查: -0(数字)在维基百科

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 >>> 

[编辑:更多信息基于意见]

当我为所有实际目的说话时,我已经很快地select了这个词。 我是说标准的平等比较。

我会在这方面增加更多的信息和参考:

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

像divmod,atan2这样的操作展现了这种行为。 事实上,atan2和底层的“C”lib一样,符合IEEE的定义。 定义见参考文献#2。

 >>> 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(#3)! 我不确定这是否稍后被拿起。

参考:

  1. http://docs.sun.com/source/806-3568/ncg_goldberg.html#924
  2. FPTAN在http://en.wikipedia.org/wiki/Atan2
  3. http://www.python.org/dev/peps/pep-0754/

它在atan2()函数中有所不同(至less在某些实现中)。 在我的Python 3.1和3.2上的Windows(基于底层的C实现,根据Python math模块文档底部附注CPython实现细节 ):

 >>> 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 

是的,0.0和-0.0之间有区别(尽pipePython不会让我重现它:-P)。 如果将正数除以0.0,则得到正无穷; 如果你用-0.0除同样的数字,你会得到负的无穷大。

除此之外,两者之间没有实际的区别。

math.copysign()会以不同的方式对待-0.0+0.0 ,除非您在奇怪的平台上运行Python:

math. copysignxy
y的符号返回x 。 在支持带符号的零的平台上, copysign(1.0, -0.0)返回-1.0

 >>> import math >>> math.copysign(1, -0.0) -1.0 >>> math.copysign(1, 0.0) 1.0 

相同的值,但不同的数字

 >>> 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 

参考:
http://docs.python.org/2/library/decimal.html#decimal.Decimal.compare http://docs.python.org/2/library/decimal.html#decimal.Decimal.compare_total