我怎样才能改进这个 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
我的圆周率计算方法是:
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