用于负零浮点值?

时间:2011-10-30 18:36:23

标签: c++ floating-point ieee-754

考虑以下C ++代码:

double someZero = 0;
std::cout << 0 - someZero << '\n';   // prints 0
std::cout << -someZero << std::endl; // prints -0

问题出现了:什么是负零好处,应该是防御性的避免(即使用减法而不是减去变量)?

5 个答案:

答案 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)

我只能看到两个真实的用例:

  1. 你想表明一个值是负的但非常小(可能是无限的),即太小而不能表示为浮点数或双精度值。
  2. 您正在使用仅允许负片的数学,但仍希望显示零。在物理学,复数和数论中有一些例子,这可能是有用的。
  3. 对于大多数人而言,它没用,应该避免。

    您可能还想看一下这个问题: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,所以我们知道它是负的。