由于在 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
我正在 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 进行修复。
相关文章:
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- 为什么我的数组双精度函数不起作用?
- 如果存在从"双精度"到"T"的转换,则禁用构造函数
- f 是指向函数的指针,该函数采用 int,并返回指向不带任何内容并返回双精度的函数的指针
- 我在C++中使用提升哈希函数将 3 个双精度组合成一个面临冲突的哈希
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 从 C++ 中的函数返回双精度的问题
- Fmod 函数清楚地输出一个预期的双精度值,但 if(fmod == 预期的双精度值)的计算结果不是 true
- 函数重载和双精度和长之间的混淆
- C++采用浮点数或双精度的模板函数
- 对需要双精度数组和结构作为输入C++ DLL 函数的 C# 调用
- 带有映射的 Lambda 函数,其中键是元组,值是双精度
- 有没有办法构造一个 constexpr 函数来获取双精度的位表示
- 函数双精度,整数如何工作?C++
- 这是为浮点数/双精度函数泛型的正确方法吗?
- 当将变量作为函数参数传递时,由于隐式铸造而导致的精度丧失
- 如何根据精度轻松模板化数学函数
- 双精度/整数模板函数的向量