2015-02-02 15 views
9

Tôi là người mới bắt đầu python và tôi muốn tính pi. Tôi đã thử sử dụng thuật toán Chudnovsky vì tôi nghe nói rằng nó nhanh hơn các thuật toán khác.Tính toán pi pi?

Đây là mã của tôi:

from math import factorial 
from decimal import Decimal, getcontext 

getcontext().prec=100 

def calc(n): 
    t= Decimal(0) 
    pi = Decimal(0) 
    deno= Decimal(0) 
    k = 0 
    for k in range(n): 
     t = ((-1)**k)*(factorial(6*k))*(13591409+545140134*k) 
     deno = factorial(3*k)*(factorial(k)**3)*(640320**(3*k)) 
     pi += Decimal(t)/Decimal(deno)         
    pi = pi * Decimal(12)/Decimal(640320**(1.5)) 
    pi = 1/pi 
    return pi 

print calc(25) 

Đối với một số lý do mã này mang lại các vakue của pi lên đến 15 số thập phân so với giá trị chấp nhận được. Tôi đã cố giải quyết điều này bằng cách tăng giá trị chính xác; điều này làm tăng số chữ số, nhưng chỉ 15 chữ số đầu tiên vẫn chính xác. Tôi đã thử thay đổi cách tính toán thuật toán và nó cũng không hoạt động. Vì vậy, câu hỏi của tôi là, là có cái gì đó có thể được thực hiện để mã này để làm cho nó chính xác hơn nhiều hoặc tôi sẽ phải sử dụng một thuật toán? Tôi sẽ đánh giá cao sự giúp đỡ với điều này bởi vì tôi không biết làm thế nào để hoạt động với rất nhiều chữ số trong python. Tôi muốn để có thể kiểm soát số lượng chữ số (chính xác) xác định và hiển thị bởi các chương trình - cho dù 10, 100, 1000, vv

+0

Chỉ cần để so sánh, đây là một số mã Chudnovsky làm việc: http://www.craig-wood.com/nick/articles/pi-chudnovsky/ – runDOSrun

Trả lời

13

Có vẻ như bạn đang mất đi độ chính xác trong dòng này:

pi = pi * Decimal(12)/Decimal(640320**(1.5)) 

Thử sử dụng:

pi = pi * Decimal(12)/Decimal(640320**Decimal(1.5)) 

Điều này xảy ra bởi vì mặc dù Python có thể xử lý số nguyên quy mô tùy ý, nó không làm như vậy cũng với phao.

Bonus

Một dòng thực hiện duy nhất sử dụng một thuật toán (các BBP formula):

from decimal import Decimal, getcontext 
getcontext().prec=100 
print sum(1/Decimal(16)**k * 
      (Decimal(4)/(8*k+1) - 
      Decimal(2)/(8*k+4) - 
      Decimal(1)/(8*k+5) - 
      Decimal(1)/(8*k+6)) for k in range(100)) 
+0

Cám ơn rất nhiều! Nó đã làm việc. Thật đáng kinh ngạc đối với tôi làm thế nào một sự thay đổi nhỏ như vậy đã tạo nên sự khác biệt. –

+0

@Juan Lopes Xin chào, bạn có thể giúp tôi viết mã giả cho công thức BBP này để tính PI –

-7

Nếu bạn muốn tìm giá trị của pi chỉ đến 53 chữ số và nếu bạn là một người mới bắt đầu, thì bạn có thể sử dụng điều này:

print 'Pi value till 53 digits:%1.53f'%(22.0/7) 
+7

22/7 không phải là π. Đó là một xấp xỉ đó là tốt để 2 chữ số sau khi điểm, do đó, nó chắc chắn không đủ tốt nếu bạn muốn 53 chữ số sau khi điểm. (Những gì bạn hiển thị không đưa ra 53 chữ số chính xác cho ngày 22/7.) –

+1

Cân nhắc xóa câu trả lời này. –

3

Dành cho những người đến đây chỉ để sẵn sàng lution để có được độ chính xác tùy ý của pi với Python:

import decimal 

def pi(): 
    """ 
    Compute Pi to the current precision. 

    Examples 
    -------- 
    >>> print(pi()) 
    3.141592653589793238462643383 

    Notes 
    ----- 
    Taken from https://docs.python.org/3/library/decimal.html#recipes 
    """ 
    decimal.getcontext().prec += 2 # extra digits for intermediate steps 
    three = decimal.Decimal(3)  # substitute "three=3.0" for regular floats 
    lasts, t, s, n, na, d, da = 0, three, 3, 1, 0, 0, 24 
    while s != lasts: 
     lasts = s 
     n, na = n + na, na + 8 
     d, da = d + da, da + 32 
     t = (t * n)/d 
     s += t 
    decimal.getcontext().prec -= 2 
    return +s    # unary plus applies the new precision 

decimal.getcontext().prec = 1000 
pi = pi() 
Các vấn đề liên quan