考虑以下C ++代码:
double someZero = 0;
std::cout << 0 - someZero << '\n'; // prints 0
std::cout << -someZero << std::endl; // prints -0
问题出现了:什么是负零好处,应该是防御性的避免(即使用减法而不是减去变量)?
答案 0 :(得分:21)
来自维基百科:
据称,在IEEE 754中包含有符号零点可以更容易地在一些关键问题中实现数值精度[1],特别是在使用复杂的基本函数进行计算时[2]。
第一个参考文献是W. Kahan撰写的“复杂基本功能的分支削减或许多无法识别位”,可以下载here。
该论文的一个例子是1/(+0)
vs 1/(-0)
。在这里,零的符号会产生巨大的差异,因为第一个表达式等于+inf
,第二个表达式等于-inf
。
答案 1 :(得分:2)
另外 签署零好:
零可以被视为扩展实数行的变体,使得1 / -0 =-∞和1 / + 0 = +∞,除以0仅对于±0 /±0未定义。
负符号零回应从下面接近0的数学分析概念作为单侧限制,其可以表示为x→0-,x→0-或x→↑0。符号“-0”可以非正式地用于表示已舍入为零的小负数。负零的概念在统计力学和其他学科中也有一些理论应用
答案 2 :(得分:0)
在处理复数时,负零例如有用......
在日常使用中,应该主要避免负零。
有关“负零”背景/使用/陷阱信息的一些链接:
答案 3 :(得分:0)
我只能看到两个真实的用例:
对于大多数人而言,它没用,应该避免。
您可能还想看一下这个问题:Is there a negative zero?和浮点IEEE 754 spec。
答案 4 :(得分:0)
我制作了一个测量应用程序,-0对于混合数字非常有用(例如分成英尺和英寸)。
想象一下,我们有一个变量&#34;长度&#34;我们正试图分成&#34;脚&#34;和&#34;英寸&#34;。
(这是java代码,但对C ++也是如此)。
feet = Math.signum(length) * Math.floor(Math.abs(length / 12));
// could also do feet = length>0 ? Math.floor(length / 12) : Math.ceil(length / 12)
inches = Math.abs(length) % 12;
如果长度在-1英尺到0英尺之间,我们希望它为脚说-0,所以我们知道它是负的。