从计算机系统:程序员的角度:
带单精度浮点
表达式的
(3.14+1e10)-1e10计算结果为 0.0:值 3.14 由于舍入而丢失。该表达式的
(1e20*1e20)*1e-20计算结果为 +∞ ,而1e20*(1e20*1e-20)计算结果为 1e20。
如何检测由于浮点加法和乘法的舍入而导致的精度损失?(在 C 或 Python 中)
下溢与我描述的问题之间有什么关系和区别?下溢是否只是由于舍入导致精度丢失的一种特殊情况,结果被舍入为零?
谢谢。
从计算机系统:程序员的角度:
带单精度浮点
表达式的
(3.14+1e10)-1e10计算结果为 0.0:值 3.14 由于舍入而丢失。该表达式的
(1e20*1e20)*1e-20计算结果为 +∞ ,而1e20*(1e20*1e-20)计算结果为 1e20。
如何检测由于浮点加法和乘法的舍入而导致的精度损失?(在 C 或 Python 中)
下溢与我描述的问题之间有什么关系和区别?下溢是否只是由于舍入导致精度丢失的一种特殊情况,结果被舍入为零?
谢谢。
浮点异常可能会在此处为您提供帮助。
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 中造成更大的损害。Float32