c++ - 由于在 32 位的 G++ 4.4.7 20120313 中使用 C++ std::vector 中的内联函数导致精度发生变化

标签 c++ gcc g++

我正在 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");
}

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

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

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

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

最佳答案

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

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

关于c++ - 由于在 32 位的 G++ 4.4.7 20120313 中使用 C++ std::vector 中的内联函数导致精度发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19996721/

相关文章:

C++:将表格 20160120 中的日期转换为纪元以来的天数

c++ - 如何生成不同的新 QColors

c++ - 交叉编译 C++ 程序时权限被拒绝

linux - Linux下thumb汇编

c++ - 为什么这个struct的大小是32?

c++ - 使用 C++ 的 A* 算法求解 n-puzzle

linux -/usr/include 中的头文件从哪里来? Linux 内核代码 或 Gcc

c++ - 在不使用其他变量的情况下用 C++ 编写程序集

c++ - benderrmq 出错

c++ - 如何使用gcc/g++编译多个cpp文件的头文件?