少量64位浮点数采用不同加法组合时最多可得到多少种不同求和结果?
浮点数不同求和方式的结果数量上限问题
此前有人提问为何sum(myfloats)与sum(reversed(myfloats))的计算结果不同,相关问题被归类到浮点数精度共性问题后删除。
引申问题
该问题引出了新的疑问:仅对少量浮点数采用不同的求和顺序或加法组合,最多能得到多少种不同的求和结果?
n=3的实测情况
测试显示3个浮点数最多可得到3种不同的和,测试代码如下:
>>> from itertools import permutations >>> for perm in permutations([0.2, 0.3, 0.4]): print(perm, sum(perm)) (0.2, 0.3, 0.4) 0.9 (0.2, 0.4, 0.3) 0.9000000000000001 (0.3, 0.2, 0.4) 0.9 (0.3, 0.4, 0.2) 0.8999999999999999 (0.4, 0.2, 0.3) 0.9000000000000001 (0.4, 0.3, 0.2) 0.8999999999999999
浮点数加法满足交换律,即a + b == b + a,3个浮点数求和时共有3种两两相加的组合,因此最多得到3种不同结果。
待解答的具体疑问
- 4个浮点数求和时可以得到超过3种不同的和吗?若不能请说明原因,若可以请给出最大数量
- 5个浮点数的最大不同和数量又是多少?
注:求和包含所有合法的加法组合方式,不限于从左到右累加,例如
(a+b) + (c+d)的分组求和也纳入统计范围,本文讨论的浮点数为Python中使用的64位浮点数,其他语言中常称为double。
解答
4个浮点数求和可以得到超过3种的不同结果,针对64位双精度浮点数,最多可以得到10种不同的和。
5个浮点数求和的最大不同结果数为30。
常规测试很难找到对应案例,是因为需要刻意构造能触发每一步不同舍入误差的特殊浮点数组合,随机选取的普通浮点数很难覆盖所有可能的误差分支,只会触发少数几种不同的求和结果。
内容的提问来源于stack exchange,提问作者no comment
相关产品推荐
相关产品推荐

