在Python中计算系数为1/2^1000的和

问题描述 投票:0回答:1

我创建了以下 python 脚本,该脚本旨在在 while 循环内计算总和,一旦总和变得足够小就终止。我遇到的问题是在循环内的第一行。

i = 0
sum_val = 1.0
while sum_val > 0.1:
    sum_val += 1-(1/2)**(1000)*math.comb(1000, i)
    i+=1

当对大于 992 的 (1/2) 指数中的值运行此代码时,无法正确计算总和。特别是,当运行指数值高于 992 时,总和会加一,直到脚本中断。总和应该减少,并且只有指数值小于 993 时才会观察到这种行为。我猜测发生这种情况的原因是 python 本质上将值 (1/2)^1000 识别为 0。运行

sys.float_info.min
时,python 返回最小浮点值 2.2250738585072014e-308,小于 (1/2)^1000。有没有某种方法可以确保 python 不会向下舍入 (1/2)^1000 到总和可以忽略不计的程度? sum_val 的值不需要非常准确,因为我对 i 最终的值更感兴趣。如有任何帮助,我们将不胜感激。

python precision
1个回答
0
投票

您的观察是正确的,由于浮点表示的限制,Python 将接近零的非常小的值实际上视为零。缓解此问题的一种方法是重构计算或使用支持任意精度算术的库,例如 Python 中的十进制模块。

以下是如何使用十进制模块调整代码:

import decimal

# Set precision
decimal.getcontext().prec = 100

i = 0
sum_val = decimal.Decimal(1.0)
while sum_val > 0.1:
    sum_val += 1 - decimal.Decimal(0.5) ** 1000 * decimal.Decimal(math.comb(1000, i))
    i += 1

print(i)

此代码确保算术运算以所需的精度执行,避免了舍入非常小的值的问题。根据您的具体要求调整精度。

© www.soinside.com 2019 - 2024. All rights reserved.