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

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

>>> 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值