python中的负零

max*_*max 47 python floating-point floating-accuracy zero

[Python 3.1]

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

k = 0.0
print(-k)
Run Code Online (Sandbox Code Playgroud)

输出将是-0.0.

但是,当我将-k0.0 比较为相等时,它会产生True.有什么区别0.0-0.0(我不在乎他们可能有不同的内部表示.我只关心自己的程序中的行为)是否有任何隐藏的陷阱我应该知道的?

pyf*_*unc 30

查看:维基百科中的-0(数字)

基本上IEEE确实定义了负零

根据这个定义用于所有目的:

-0.0 == +0.0 == 0
Run Code Online (Sandbox Code Playgroud)

我同意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
>>> 
Run Code Online (Sandbox Code Playgroud)

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

当我为了所有实际目的而说,我选择了这个词而不是草率.我的意思是标准的平等比较

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

(1)如参考文献所述,IEEE标准定义了比较,使得+0 = -0,而不是-0 <+0.尽管总是可以忽略零符号,但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
Run Code Online (Sandbox Code Playgroud)

一种方法是通过文档查明实现是否符合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/


Cra*_*een 16

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

>>> 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
Run Code Online (Sandbox Code Playgroud)


小智 13

math.copysign()对待-0.0+0.0不同的,除非你是在一个奇怪的平台上运行的Python:

math.复制符号(X,ÿ)
     返回X与符号ÿ.在支持签名零的平台上,copysign(1.0, -0.0)返回-1.0.

>>> import math
>>> math.copysign(1, -0.0)
-1.0
>>> math.copysign(1, 0.0)
1.0
Run Code Online (Sandbox Code Playgroud)


Chr*_*ung 11

是的,0.0和-0.0之间存在差异(尽管Python不允许我重现它:-P).如果将正数除以0.0,则得到正无穷大; 如果将相同的数字除以-0.0,则得到负无穷大.

除此之外,两个值之间没有实际差异.

  • @Falmarri:在Python中,你做不到; 在其他语言中,你很好.我在一般的浮点处理意义上解决了0.0和-0.0之间的区别. (10认同)
  • 你不能除以0.如果你正在谈论谈论限制,-0甚至没有意义. (4认同)
  • +1取消downvotes.克里斯是正确的,例如,在C中,浮点除以0.0被定义为产生无穷大的符号(分子和分母有相同的符号)?正负. (4认同)
  • @DMan:重要的是(a)它们存在并且(b)有一个实现.(即使它是偏袒的.)因为你(和我)没有看到复杂的数学微妙之处并不意味着什么.它们仍然存在.我不了解偏微分方程,并没有看到实用价值.有些人这样做.我认为标准中的实用价值有限.这不是重点.我对"实际"的拙见没有任何价值.它仍然存在,它仍然有意义,它仍然部分实现. (4认同)
  • -1因为得到ZeroDivisonError,所以不能将数字0除以.这意味着没有区别. (3认同)
  • 您忘记了**的优先级高于-的优先级。(-0.0)** 0得到1.0。 (2认同)
  • @DMan你想要除以±0.0,因为浮点数+0.0并不代表数学上的0。它代表接近0的数字范围。算术下溢是你可以在数学上不达到0的情况下获得值+0.0的一种方法。 (2认同)
  • 我碰巧打开了一个关于带符号零的目的的未读选项卡:https://softwareengineering.stackexchange.com/questions/280648/why-is-negative-zero-important (2认同)