由于在 g++ 4.4.7 的 std::vector 中使用内联函数而导致精度变化C++ 32 位20120313

Change in precision due to use of inline function in C++ std::vector with g++ 4.4.7 20120313 in 32 bit

本文关键字:函数 精度 变化 20120313 C++ g++ std vector      更新时间:2023-10-16

我正在 centos5.9 32 位(在 64 位机器上运行)上编译,目标是 32 位。 G++ 版本是 4.4.7,不是 CentOS5.9 默认提供的版本,但它可以与 yum 一起下载,并作为发行版的一部分提供。

我有一个非常简单的循环,如下所示

std::vector<double> result(n);
std::vector<double> values(n);
// here I compute values(). They are correct and I extensively noted 
// that there's nothing wrong there. The problem is here
result[0] = 0.0;
for ( int i = 0 ; i < n-1 ; ++i ) {
    result[i+1] = result[i]+values[i];
    // printf("x");
}

在此代码的更复杂的版本中(显示了完全相同的问题),我将以下运算符用于将 std::vector 封装为直通的类 RealVector

inline double & operator[] (int index) { return data_[index]; }

问题是我在结果中发现了一个微小但相关的数值差异,这取决于运算符 [] 是否是内联的。同样,如果我取消注释上面给出的 printf() 行,我也会更改结果。请注意,在具有相同配置的 centos59 64 位中不会出现此问题,或者如果出现问题,则低于可检测性。

这是一个编译器错误,还是有一些微妙的魔力正在发生?我试图检查asm和解析树,但它太复杂了,无法理解。我通常使用 C 进行管理,但C++生成的文件中发生了太多的黑暗魔法。

可能又是旧的x87有趣的功能,80位寄存器。将该寄存器溢出到内存会导致舍入到 64 位,并且发生在不可预测的时刻。C根本不是C++独有的,它有同样的问题。在Java中,它很"复杂"

通过移动到 64 位构建和 SSE 进行修复。