【问题标题】:Gauss-Legendre Algorithm in pythonpython中的高斯-勒让德算法
【发布时间】:2008-12-07 16:15:40
【问题描述】:

我需要一些帮助来计算 Pi。我正在尝试编写一个将 Pi 计算为 X 位的 python 程序。我已经从 python 邮件列表中尝试了几个,它对我的​​使用来说很慢。 我已经阅读了有关Gauss-Legendre Algorithm 的信息,并尝试将其移植到 Python,但没有成功。

我正在阅读来自Here 的内容,如果您能提供任何关于我哪里出错的信息,我将不胜感激!

输出:0.163991276262

from __future__ import division
import math
def square(x):return x*x
a = 1
b = 1/math.sqrt(2)
t = 1/4
x = 1
for i in range(1000):
    y = a
    a = (a+b)/2
    b = math.sqrt(b*y)
    t = t - x * square((y-a))
    x = 2* x

pi = (square((a+b)))/4*t
print pi
raw_input()

【问题讨论】:

    标签: python algorithm pi


    【解决方案1】:
    1. 你忘记了 4*t 周围的括号:

      pi = (a+b)**2 / (4*t)
      
    2. 您可以使用decimal进行更高精度的计算。

      #!/usr/bin/env python
      from __future__ import with_statement
      import decimal
      
      def pi_gauss_legendre():
          D = decimal.Decimal
          with decimal.localcontext() as ctx:
              ctx.prec += 2                
              a, b, t, p = 1, 1/D(2).sqrt(), 1/D(4), 1                
              pi = None
              while 1:
                  an    = (a + b) / 2
                  b     = (a * b).sqrt()
                  t    -= p * (a - an) * (a - an)
                  a, p  = an, 2*p
                  piold = pi
                  pi    = (a + b) * (a + b) / (4 * t)
                  if pi == piold:  # equal within given precision
                      break
          return +pi
      
      decimal.getcontext().prec = 100
      print pi_gauss_legendre()
      

    输出:

    3.141592653589793238462643383279502884197169399375105820974944592307816406286208\
        998628034825342117068
    

    【讨论】:

    • 除非您更改为使用其他数据类型,否则使用 32 位或 64 位浮点运算可以获得 24 位或 53 位精度的最佳值。欲了解更多信息,请参阅en.wikipedia.org/wiki/IEEE_754
    • @tvanfosson:我发布了使用decimal 的版本。它允许任意精度。
    • +1 -- 不知道 Python 有小数点,而 mxNumber 是谷歌弹出的第一个项目。
    【解决方案2】:
    1. 如果要将 PI 计算到 1000 位,您需要使用支持 1000 位精度的数据类型(例如,mxNumber
    2. 您需要计算 a、b、t 和 x,直到 |a-b|
    3. 用@J.F.计算平方和圆周率。建议。

    【讨论】:

    • 十进制模块足以容纳 1000 位数字。
    【解决方案3】:
    pi = (square((a+b)))/4*t
    

    应该是

    pi = (square((a+b)))/(4*t)
    

    【讨论】:

      猜你喜欢
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      相关资源
      最近更新 更多