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)! 我不确定这是否稍后被拿起。
参考:
它在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.
copysign ( x , y )
用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