您可以使用以下内容:
#include <iostream>
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
template <typename F> F sum (const F a, const F b, F &error) {
int round = fegetround();
fesetround(FE_TONEAREST);
F c = a + b;
fesetround(FE_DOWNWARD);
F c_lo = a + b;
fesetround(FE_UPWARD);
F c_hi = a + b;
fesetround(FE_TONEAREST);
error = std::max((c - c_lo), (c_hi - c));
fesetround(round);
return c;
}
int main() {
float a = 23.23528;
float b = 4.234;
float e;
std::cout << sum(a, b, e) << std::endl;
std::cout << e << std::endl;
}
error
参数中返回对最大错误量的快速估计。请记住,切换舍入模式会刷新浮点单元 (FPU) 流水线,因此不要指望超快的速度。
更好的解决方案是尝试区间算术(倾向于给出悲观的误差区间,因为没有考虑变量相关性)或仿射算术(跟踪变量相关性,因此给出了更严格的误差范围)。
在这里阅读这些方法的入门:
http ://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.36.8089