如何检测由于浮点加法和乘法的舍入而导致的精度损失?

计算科学 浮点 精确 计算机算术
2021-11-28 18:48:18

从计算机系统:程序员的角度:

带单精度浮点

  • 表达式的(3.14+1e10)-1e10计算结果为 0.0:值 3.14 由于舍入而丢失。

  • 该表达式的(1e20*1e20)*1e-20计算结果为 +∞ ,而1e20*(1e20*1e-20)计算结果为 1e20。

  • 如何检测由于浮点加法和乘法的舍入而导致的精度损失?(在 C 或 Python 中)

  • 下溢与我描述的问题之间有什么关系和区别?下溢是否只是由于舍入导致精度丢失的一种特殊情况,结果被舍入为零?

谢谢。

2个回答

浮点异常可能会在此处为您提供帮助。

C 支持因实现(编译器)而异,但请参见此处的 GCC:https ://www.gnu.org/software/libc/manual/html_node/FP-Exceptions.html

此处记录了 Python 支持: https ://docs.python.org/2/library/fpectl.html

我只使用了几次这些功能,然后只使用了英特尔编译器(https://software.intel.com/content/www/us/en/develop/documentation/cpp-compiler-developer-guide-and -reference/top/compiler-reference/compiler-options/compiler-option-details/floating-point-options/fp-trap-qfp-trap.html),但在这种情况下,我能够捕获截断和其他非-fatal 错误(例如,fatal 将被零除)。

通常,人们不会尝试通过算法检测精度损失,而是分析和修改算法以评估它们如何受到它的影响。

例如,在您的第一个示例中,您将运行(前向)误差分析并确定总和误差以为界,其中是机器精度,或者您会证明总和是向后稳定的,因此总和并没有比存储在 a did 中造成更大的损害。31010uu1010Float32