在C ++中,例如fmod(-2,2)
返回-0
。表达式-0 == 0
为真,但位不同。 -0
之类的内容应该是0
但是表达方式不同的目的是什么? -0
在任何计算中使用的方式与0
完全相同吗?
答案 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?)实现引起的,其中符号位被明确处理并在处理结束时附加回结果。