IEEE浮点标准是什么(+0)+( - 0)?

时间:2015-03-09 19:00:12

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

我认为任何浮点数的算术运算都是由IEEE浮点数标准明确定义的吗?如果是,只是出于好奇,(+0)+(-0)是什么?有没有办法在实践中用C ++或其他常用的编程语言来检查这些东西?

4 个答案:

答案 0 :(得分:16)

用于签名零的IEEE 754算术规则表明+0.0 + -0.0取决于舍入模式。在默认的舍入模式下,它将是+0.0。向-∞舍入时,它将为-0.0

您可以在C ++中查看此内容,如下所示:

#include <iostream>

int main() {
    std::cout << "+0.0 + +0.0 == " << +0.0 + +0.0 << std::endl;
    std::cout << "+0.0 + -0.0 == " << +0.0 + -0.0 << std::endl;
    std::cout << "-0.0 + +0.0 == " << -0.0 + +0.0 << std::endl;
    std::cout << "-0.0 + -0.0 == " << -0.0 + -0.0 << std::endl;
    return 0;
}

Output

+0.0 + +0.0 == 0
+0.0 + -0.0 == 0
-0.0 + +0.0 == 0
-0.0 + -0.0 == -0

答案 1 :(得分:1)

我的回答涉及IEEE 754:2008,这是该标准的当前版本。

在IEEE 754:2008标准中:

第4.3节讨论在执行算术运算时舍入值,以便将这些位拟合到尾数中。

  

4.3舍入方向属性

     

舍入将数字视为无限精确,并在必要时修改它以适合目标的格式,同时在适当时发出不准确的异常,下溢或溢出(参见7)。除非另有说明,否则每次操作都应按照本条款中的一个属性,首先产生一个正确无限精度和无限范围的中间结果,然后进行四舍五入。

     

舍入方向属性会影响可能不准确的所有计算操作。不精确的数值浮点结果总是与未包含的结果具有相同的符号。

     

舍入方向属性会影响精确零和的符号(见6.3),并且还会影响阈值,超过该阈值就会发出上溢和下溢信号。


6.3节规定了使用特殊值(NaN,无穷大,+ 0,-0)执行算术时符号位的值。

  

6.3符号位

     

当具有相反符号的两个操作数的总和(或具有相同符号的两个操作数的差异)恰好为零时,在所有舍入方向属性中该和(或差)的符号应为+ 0除外roundTowardNegative ;在该属性下,精确零和(或差)的符号应为-0。

     

但是,即使x为零,x + x = x - ( - x)仍保留与x相同的符号。

(强调我的)

换句话说,(+ 0)+( - 0)= + 0,除非rounding moderoundTowardNegative,在这种情况下它是(+0)+( - 0)= - 0




在C#:

的上下文中

根据§7.7.4C# Language Specification(强调我的):

  
      
  • 浮点加法:
  •   
     

float operator +(float x, float y);

     

double operator +(double x, double y);

     

总和是根据IEEE 754算法的规则计算的。下表列出了非零有限值,零,无穷大和NaN的所有可能组合的结果。在表中,x和y是非零有限值,z是x + y的结果。 如果x和y具有相同的幅度但符号相反,则z为正零。如果x + y太大而无法在目标类型中表示,则z是无穷大,其符号与x + y相同。

 +  •  x      +0     -0     +∞     -∞    NaN
•••••••••••••••••••••••••••••••••••••••••••••
y   •  z      y      y      +∞     -∞    NaN
+0  •  x      +0     +0     +∞     -∞    NaN
-0  •  x      +0     -0     +∞     -∞    NaN
+∞  •  +∞     +∞     +∞     +∞     NaN   NaN
-∞  •  -∞     -∞     -∞     NaN    -∞    NaN
NaN •  NaN    NaN    NaN    NaN    NaN   NaN

C#中的

(+ 0)+( - 0):

换句话说,根据规范,如果两者为负零,则仅添加两个零会导致负零。因此,答案原来的问题

  

IEEE浮点标准是什么(+0)+( - 0)?

是+0。


C#中的舍入模式:

如果有人有兴趣更改C#中的舍入模式,请在&#34; Is there an C# equivalent of c++ fesetround() function?&#34;,Hans Passant州:

  

永远不要修改C#中的FPU控制字。这是你能想象到的最糟糕的全局变量。由于全局导致的标准痛苦,你的变化不会持久,并且会随意消失。 CLR中的内部异常处理代码在处理异常时重置它。

答案 2 :(得分:1)

假设标准舍入模式(如果您不知道舍入模式是什么以及如何更改它,则使用标准舍入模式。)

如果确切的结果非零但是很小以至于四舍五入为零,如果确切结果大于0则结果为+0,如果确切结果小于0则结果为-0。仅此情况发生乘法和除法,而不是加法和减法。

有几种情况确切结果为零。在这种情况下,在以下情况下结果为-0:添加(-0)+( - 0)。减去(-0) - (+0)。乘以一个因子为零,另一个因子具有相反的符号(包括(+0)*( - 0)。将零除以非零数,包括相反符号的无穷大。在所有其他情况下,结果是+0。

此规则的一个不幸的副作用是x + 0.0并不总是与x相同(不是x是-0时)。另一方面,x - 0.0总是与x相同。此外,x * 0.0可以是+0或-0,具体取决于x。这可以防止精确支持IEE754的编译器进行一些优化,或者使它们更加困难。

答案 3 :(得分:0)

IEEE浮点标准的答案是+0。