问我的浮点计算行为异常,在不同的机器上给出不同的结果。
答首先,请参阅问题 14.2。
如果问题没有那么简单,请记住,数字计算机通常使用浮点格式,它提供了对实数算术的近似模拟,但绝不是精确的。除其他事项外,结合律和分配律并不完全成立;也就是说,运算顺序可能很重要,重复加法不一定等同于乘法。下溢、累积精度损失和其他异常经常会带来麻烦。
不要假设浮点结果是精确的,尤其不要假设浮点值可以进行相等性比较。(也不要随意添加“模糊因子”;请参阅问题 14.5。)请注意,某些机器在浮点计算寄存器中提供的精度可能高于存储在内存中的double值,这可能导致浮点不等式,尽管您会认为两个值“必须”相等。
这些问题对于 C 语言来说并不比其他任何计算机语言更糟。浮点运算的某些方面通常被定义为“处理器如何处理它们”(另请参阅问题 11.33 和 11.34),否则,对于没有“正确”模型的机器的编译器将不得不执行成本高昂的模拟。
本文档无法开始列出与浮点工作相关的陷阱和适当的解决方法。一本好的数值编程书籍应涵盖基础知识;另请参阅下面的参考文献。(不过请注意,细微的问题可能会困扰数值分析师多年。)
参考文献:Kernighan 和 Plauger,《编程风格要素》第 6 章,第 115-8 页
Knuth,第 2 卷第 4 章
David Goldberg,“每个计算机科学家都应该知道的浮点运算知识”