我的Java教科书指出,在处理浮点数时,从最大到最小的加法不如从最小到最大的加法精确。但是,他没有继续明确解释为什么会这样。

最佳答案

浮点数的精度位数有限(float为6,double为15)。计算

1.0e20d + 1


给出结果1.0e20,因为没有足够的精度来表示数字

100,000,000,000,000,000,001


如果从最大的数字开始,那么任何大于n个数量级以下的数字(其中,n是6或15,具体取决于类型)都将完全不构成总和。从最小的数字开始,您可能将几个较小的数字求和,这将影响最终总数。

例如,在哪里会有所作为

1.0e20 + 1.0e4 + 6.0e4 + 3.0e4


假设它的精确度是15位小数位数(不是,请参见下面的链接文章,但对于示例来说,15位就足够了),如果您以较大的数字开头,那么其他任何一个都不会有所作为,因为它们太小了。如果从较小的开始,则它们的总和为1.0e5,该大小足以影响最终总数。

请阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic

10-08 18:42