在不同的平台/编译器上获得相同的浮点计算结果?

时间:2019-03-07 14:20:39

标签: c++ c double ieee-754 fpu

不同的平台具有不同的FP功能,这些FP功能具有不同的参数和行为,因此它们产生的计算结果之间存在一定程度的差异,并在每个中间步骤上级联和放大。

我处于一种情况(对于{+-*/)而言,使用不同的编译器供应商在每个不同的目标平台上产生相同的结果至关重要,因此我想知道是否存在一种标准的方法那。我不是在问任意的高精度浮点数,而是在问标准的64位IEEE double,这是可以预期的并且可以容忍的。

1 个答案:

答案 0 :(得分:0)

即使您具有64位IEEE754 double,也需要检查一些额外的内容。

  1. 确保您具有 strict 浮点数。例如,不允许您的编译器使用80位进行中间计算。

  2. IEEE754需要进行各种运算(所有数学运算,例如您提到的std::sqrt等),以返回最佳数字。 (是否需要其他人,然后确保IEEE754标准中提到了所有操作,并且您的平台忠实地遵守了-可能没有。)

  3. 避开其他功能(例如三角函数),即使在IEEE754下也无法保证精度。

在您的特定情况下,似乎(1)就足够了,也许(对于C ++)

static_assert(std::numeric_limits<double>::is_iec559, "IEEE 754 floating point required");