浮点运算的精度

  • 本文关键字:精度 浮点运算 c++
  • 更新时间 :
  • 英文 :


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

float a = 7;
float b = a / 32.0;
float c = a + b;
float d = c - a;
assert( d == b );
是否可以

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

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

否,

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

"Real"机器在完全实现标准时非常小心(只要记住奔腾部门错误)。但要小心检查,i386 系列机器确实在其寄存器中使用了一些额外的位,这些位在分配给内存/从内存分配时被切断,因此仅在寄存器中进行的计算给出的结果与溢出到内存的一些中间结果不同。

另请查看David Goldberg的《每个计算机科学家都应该知道的关于浮点运算的知识》。

无论如何,"四舍五入"(或以其他方式破坏)一个可以精确表示的数字没有任何意义。

最新更新