我怎样才能改进这个 python 近似圆周率的代码?

How can I improve this python code approximating pi?

我的圆周率计算方法是:

import math
a = 2
n = int(input('number:'))

for i in range(n):
    a = 2 - math.sqrt(4-a)
    print((2**(i+2))*math.sqrt(a))

如果这很好用,打印输出会变得非常接近圆周率。但是当我尝试这个的时候,它似乎收敛到pi值,但是变得比pi越来越大,达到4,然后下降到0。

我该如何解决这个问题?

虽然您尝试实现的公式在数学上是正确的,但它假定所有计算都以精确的精度执行。同时,计算机只能以一定的精度表示 floating-point 个数字,并且对这些数字的所有操作都涉及舍入误差。在某些情况下,例如在这种情况下,这些错误会累积并完全扭曲计算结果。

为了缓解这个问题,您可以使用 Python decimal 库,它可以比标准 Python floating-point 数字提供的计算精度更高. 例如,您可以尝试以下操作:

from decimal import Decimal, getcontext

# set precision to 30 places
getcontext().prec = 30

n = 10

a = Decimal(2)
for i in range(n):
    a = 2 - Decimal(4 - a).sqrt()
    print((Decimal(2)**Decimal(i + 2)) * a.sqrt())

这给出:

3.06146745892071817382767987224
3.12144515225805228557255789567
3.13654849054593926381425804437
3.14033115695475291231711852416
3.14127725093277286806201976961
3.14151380114430107632851506557
3.14157294036709138413580013914
3.14158772527715970062885414319
3.14159142151119997399797180376
3.14159234557011774234037803153