Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的负零_Python_Floating Point_Floating Accuracy_Zero - Fatal编程技术网

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,你得到负无穷大 不过,除此之外,这两个值之间并没有实

我在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,你得到负无穷大

不过,除此之外,这两个值之间并没有实际差异。

请查看

基本上,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