سؤال

أحتاج إلى بعض المساعدة في حساب Pi.أحاول كتابة برنامج بيثون يحسب أرقام Pi إلى X.لقد قمت بتجربة العديد من القائمة البريدية للبايثون، وكان استخدامها بطيئًا.لقد قرأت عن خوارزمية غاوس ليجندر, ولقد حاولت نقله إلى بايثون دون جدوى.

أنا أقرأ من هنا, ، وسأكون ممتنًا لأي مساهمة فيما يتعلق بالمكان الذي أخطأت فيه!

يخرج: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()
هل كانت مفيدة؟

المحلول

  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

نصائح أخرى

  1. إذا كنت تريد حساب PI حتى 1000 رقم، فأنت بحاجة إلى استخدام نوع بيانات يدعم 1000 رقم من الدقة (على سبيل المثال، mxNumber)
  2. تحتاج إلى حساب A و B و T و X حتى | AB | <10 **-أرقام ، وليس تكرار الأرقام.
  3. احسب المربع والباي كـ @J.F.وتقترح.
pi = (square((a+b)))/4*t

يجب أن يكون

pi = (square((a+b)))/(4*t)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top