浮点运算的精度

时间:2014-03-01 21:30:21

标签: c++

浮点运算通常是相应算术运算的近似值,因为在许多情况下,精确的运算结果不能用内部数字格式表示。但是,如果我有一个程序,所有数字实际上可以用IEEE 754单精度完全表示,会发生什么?例如考虑这个:

float a = 7;
float b = a / 32.0;
float c = a + b;
float d = c - a;
assert( d == b );

可以安全地假设在这种情况和类似情况下,数值计算的结果与精确的算术结果相同吗?我认为这种代码可以在每台实际的机器上运行。这是对的吗?

编辑这个问题不是关于标准的内容,而是关于现实世界。我很清楚理论上 可以创建一个符合要求的引擎,但这会导致失败。我不在乎,而是我想知道这是否适用于现有的机器。

2 个答案:

答案 0 :(得分:2)

否,因为c ++标准不要求浮点值以IEEE 754格式存储。

答案 1 :(得分:0)

“真正的”机器在准确实施标准时非常谨慎(只需记住Pentium division bug)。但是要小心检查,i386系列机器确实在其寄存器中使用了一些额外的位,这些位在与存储器进行对齐时被切断,因此仅在寄存器中进行的计算产生的结果与将某些中间结果溢出到存储器的结果不同。

另请查看David Goldberg的What every computer scientist should know about floating point arithmetic

在任何情况下,对于可以精确表示的数字进行“舍入”(或以其他方式修改)没有任何意义。