from decimal import Decimal, localcontext
def pi():
with localcontext() as ctx:
ctx.prec = 100 # 100 digits precision
pi = Decimal(0)
for k in range(350):
pi += (Decimal(4)/(Decimal(8)*k+1) - Decimal(2)/(Decimal(8)*k+4) - Decimal(1)/(Decimal(8)*k+5) - Decimal(1)/(Decimal(8)*k+6)) / Decimal(16)**k
return pi
import decimal
decimal.getcontext().prec = 100
def pi():
pi = decimal.Decimal(0)
for k in range(350):
pi += (decimal.Decimal(4)/(decimal.Decimal(8)*decimal.Decimal(k+1))...)
16.*256太大,无法存储在双精度浮点中。我建议你运行你的周期少,像范围(250),因为更大的k值不会贡献到前100位。
另一件事,你可以尝试乘以16.*(-k),而不是除以16。*k。对于大k,此数字将四舍五入为零,因此不会出现运行时错误。
我建议您使用numpy.power而不是**,它可以更好地处理溢出。例如,在您的代码中,numpy.power(16.,256)的计算结果是inf,将有限的数字除以inf得到零,这样就避免了运行时错误,就像前面一段中建议的方法一样。
您达到了平台的
float
支持的极限,可能是在k = 256
之后:请参阅
sys.float_info
了解确切的限制,但您不太可能遇到当前的CPU和OS组合,在任何情况下都会给您100个有效数字;我的MacBook Pro和64位OS X只支持15个。使用^{} module 超越硬件限制。
Python浮动既不是任意精度,也不是无限大小。当k=349时,
16.**k
太大了,差不多是2^1400。幸运的是,decimal
库允许任意精度并可以处理大小:相关问题 更多 >
编程相关推荐