2008-12-07 18 views
13

Pi hesaplamasında yardıma ihtiyacım var. Pi ile X basamaklarını hesaplayacak bir python programı yazmaya çalışıyorum. Python posta listesinden birkaç tane denedim ve kullanımım yavaşlatmak. Gauss-Legendre Algorithm hakkında okudum ve Python'a başarıyla ulaşmayı denedim.Python'da Gauss-Legendre Algoritması

Here adresinden okuyorum ve nereye yanlış gittiğime ilişkin herhangi bir girişi takdir ediyorum!

O çıkarır: 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() 

cevap

25
  1. Sen 4*t parantez unuttum:

    pi = (a+b)**2/(4*t) 
    
  2. Sen yüksek hassasiyetle hesaplama gerçekleştirmek için decimal kullanabilirsiniz.

    #!/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() 
    

Çıktı: 1000 basamak PI hesaplamak istiyorsanız

3.141592653589793238462643383279502884197169399375105820974944592307816406286208\ 
    998628034825342117068 
+0

Başka bir veri türünü kullanmak için değiştirmedikçe, elde edebileceğiniz en iyi değer, 32 veya 64 bit kayan nokta aritmetiği kullanılarak 24 veya 53 hane duyarlıdır. Daha fazla bilgi için bkz. Http://en.wikipedia.org/wiki/IEEE_754. – tvanfosson

+3

@tvanfosson: 'Ondalık' kullanan bir sürüm yayınladım. Keyfi hassasiyet sağlar. – jfs

+0

+1 - Python'un ondalık olduğunu ve mxNumber'in Google'da açılan ilk öğe olduğunu bilmiyordu. – tvanfosson

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

bir veri türünü kullanmak gerekir

pi = (square((a+b)))/(4*t) 
3
  1. olması gerektiğini 1000 basamak hassasiyeti destekler (ör., mxNumber)
  2. a, b, t ve x hesaplarını | a-b | < 10 ** - rakamlar, basamak zamanını tekrarlamıyor.
  3. Kare ve pi'yi @ J.F olarak hesaplayın. önerir.
+2

ondalık modül 1000 basamak için yeterlidir. – jfs