-0和0之间有什么区别?

时间:2010-09-14 09:06:10

标签: c++ floating-point

在C ++中,例如fmod(-2,2)返回-0。表达式-0 == 0为真,但位不同。 -0之类的内容应该是0但是表达方式不同的目的是什么? -0在任何计算中使用的方式与0完全相同吗?

4 个答案:

答案 0 :(得分:13)

不,+0-0在每次计算中都不会以相同的方式使用。例如:

3·(+0) = +0
+0/-3 = -0

我建议你阅读David Goldberg撰写的What Every Computer Scientist Should Know About Floating-point arithmetic,其中阐明了为什么在浮点算术中需要+0和-0以及它们的不同之处。

关于+0 ad -0如何不同(以及为什么在处理复杂值时有用)的例子可以在Kahan,W。1987中找到。复杂基本函数的分支削减,在“数值分析的最新进展“(我无法找到这篇文章的pdf,你可以在当地的大学图书馆找到一篇)。

答案 1 :(得分:10)

Signed Zero维基百科页面将回答大部分问题:

  

有符号的零为零   标志。在普通算术中,-0 = 0。   但是,在计算中,有些数字   表示允许   存在两个零,通常表示   由-0(负零)和+0(正   零)。这发生在一些签名   整数的数字表示,   并且在大多数浮点数   表示。数字0是   通常编码为+0,但它可以   用+0或-0表示。

     

用于浮动的IEEE 754标准   点算术(目前由   大多数计算机和编程   支持浮点的语言   数字)需要+0和-0。该   零可以被视为变体   扩展实数行的这种情况   1 / -0 =-∞和1 / + 0 = +∞,除法   对于±0 /±0,只有零定义。

     

(...)

     声称包含了   IEEE 754中的零符号表明它很多   更容易实现数值精度   在一些关键问题中,   特别是在复杂的计算中   基本功能。

答案 2 :(得分:3)

IEEE标准754允许+0和-0。相同的尾数,不同的标志。它们在计算中应该是相同的。

答案 3 :(得分:-3)

我认为负号是由fmod(mis?)实现引起的,其中符号位被明确处理并在处理结束时附加回结果。