补偿求和:解决浮点数加法精度损失的简单方法

本文探讨了浮点数计算中因数值过大导致的有效位丢失问题,提出了补偿求和法,通过记录和累计精度损失来确保大数加法的准确性。通过实例和代码展示了如何使用此方法解决累加过程中的精度问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当两个浮点数大小相差过大时,较小的浮点数右移太多位导致有效位全部丢失,比如:

>>> 10**15+1.0
1000000000000001.0
>>> 10**16+1.0
1e+16  # 浮点数1.0完全丢失,没加上

>>> 0.3+0.6
0.8999999999999999  # 精度产生损失

常见场景为累加求和,和越来越大,达到能使有效位全部丢失的大小时,加法失效

补偿求和法

原理为将损失的精度记录下来,在下次做加法时加给较小的数

sum = 0
delta= 0.1
loss = 0

for i in range(10**10):
	last_sum = sum
	sum += delta + loss
	# 损失 = 期望sum - 实际sum
	# loss = last_sum + delta - sum, 这里last_sum + delta有精度损失,所以做下交换
	# loss = last_sum - sum + delta
	loss = last_sum - sum + delta
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值