我目前正在阅读优秀的双精度和四倍精度算术库文献,在最初几行中我注意到他们用以下方式执行求和:
std::pair<double, double> TwoSum(double a, double b)
{
double s = a + b;
double v = s - a;
double e = (a - (s - v)) + (b - v);
return std::make_pair(s, e);
}
误差计算依赖于一项事实,即由于IEEE-754浮点数运算的非结合性质,计算完全遵循操作顺序。
如果我在现代优化的C++编译器(例如MSVC或gcc)中编译它,可以确保编译器不会优化掉这种计算方法吗?
其次,在C++标准中是否有任何保证?