代码之家  ›  专栏  ›  技术社区  ›  BorneNeedsHelp

Pi计算错误

  •  1
  • BorneNeedsHelp  · 技术社区  · 2 年前

    所以我更喜欢圆周率和公式等等。我觉得圆周率很酷,所以我查了一下如何用Python计算圆周率。我使用了多个公式,但花了很长时间。然后我偶然发现了丘德诺夫斯基公式。我查了一下,把整个公式粘贴到Pycharm中。它不起作用,打印了163096908.00。什么甚至都不接近!我看了维基百科,他们有一个Python脚本!复制了它,它确实工作了,但它打印了进去并数组了。请帮忙!我想不通,人工智能一直在告诉我同样的事情!这是代码:

    import math
    import time
    def chudnovsky(n):
        k = 0
        pi_sum = 0
        while k < n:
            pi_sum += (-1) ** k * math.factorial(6 * k) * (545140134 * k + 13591409) /    (math.factorial(3 * k) * (math.factorial(k)) ** 3 * 640320 ** (3 * k))
            k += 1
        return 12 * pi_sum
    
    start_time = time.time()
    n = int(input("10 ** >"))
    digits = 10 ** n
    calculated_pi = chudnovsky(digits)
    end_time = time.time()
    final_time = start_time - end_time
    print(f"Pi to decimal places: {calculated_pi:.{n}f}")
    print(f"Calculation time: {final_time}")
    

    我不知道出了什么问题。没有错误,只是一个错误的数字,当我想要超过2位数时,它会在末尾打印多个小数。希望有人能帮忙!

    1 回复  |  直到 2 年前
        1
  •  2
  •   user24714692    2 年前

    使用 Decimal 为了获得更高的精度,还设置了更高的精确度:

    import decimal
    
    
    def chudnovsky(n):
        decimal.getcontext().prec = n + 15
        C = 426880 * decimal.Decimal(10005).sqrt()
        K = decimal.Decimal(13591409)
        M, X = decimal.Decimal(1), decimal.Decimal(1)
        L = decimal.Decimal(545140134)
        S = K
    
        for i in range(1, n):
            M = (M * (12 * i - 11) * (12 * i - 7) * (12 * i - 5) * (12 * i - 1)) / (i ** 3 * 640320 ** 3)
            K += L
            X *= -262537412640768000
            S += decimal.Decimal(M * K) / X
    
        pi = C / S
        return pi
    
    
    n = 5
    calculated_pi = chudnovsky(n)
    print(f"Pi to {n} decimal places: {str(calculated_pi)[:n + 15]}")
    
    

    打印

    圆周率至小数点后5位:3.141592653589734207