【问题标题】:Uses for negative zero floating point value?用于负零浮点值?
【发布时间】:2011-10-30 18:36:22
【问题描述】:

考虑以下 C++ 代码:

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

问题出现了:负零有什么好处,是否应该防御性地避免(即使用减法而不是在变量上加上减号)?

【问题讨论】:

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


【解决方案1】:

来自维基百科:

据称,IEEE 754 中包含有符号零使得在一些关键问题[1] 中实现数值精度变得更加容易,特别是在使用复杂的初等函数进行计算时[2]。

第一个参考文献是 W. Kahan 的“Branch Cuts for Complex Elementary Functions or Much Ado About Nothing's Sign Bit”,可在here 下载。

该论文中的一个示例是 1/(+0)1/(-0)。在这里,零的符号有很大的不同,因为第一个表达式等于+inf,第二个表达式等于-inf

【讨论】:

  • 虽然这并不能解释有符号零在编程语言中的用途。
【解决方案2】:

另外 签名零适合:

可以将零视为扩展实数线的变体,使得 1/-0 = -∞ 和 1/+0 = +∞,除以零仅在 ±0/±0 时未定义。

负符号零呼应了数学分析的概念,即从下方接近0作为单边极限,可以用x→0−、x→0−或x→↑0表示。符号“-0”可以非正式地用于表示已四舍五入为零的小负数。负零的概念在统计力学等学科也有一定的理论应用

【讨论】:

  • 我想知道是否有三个零会有所帮助:正数、负数和无符号数,减去两个负数,或者将两个符号相反且大小相等的数相加,得到一个无符号数零?除以有符号零应产生无穷大,但除以无符号零应产生 NaN。
【解决方案3】:

我正在制作一个测量应用程序,-0 对于混合数字(例如分成英尺和英寸)非常有用。

假设我们有一个可变的“长度”,我们试图将其分成“英尺”和“英寸”。

(这是 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,这样我们就知道它是负数。

【讨论】:

    【解决方案4】:

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

    1. 您希望显示一个值为负但非常非常小的值(可能是无穷小),即太小而无法表示为浮点数或双精度数。
    2. 您正在使用仅允许负数但仍希望显示零的数学。这在物理学、复数和数论中的一些案例很有用。

    在大多数情况下,它没有用,应该避免。

    您可能还想看看这个问题:Is there a negative zero?IEEE 754 spec 浮点数。

    【讨论】:

      【解决方案5】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 2018-04-17
      • 2012-04-19
      • 2015-03-31
      相关资源
      最近更新 更多