我的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