Print pi to a number of decimal places

前端 未结 7 2482
感情败类
感情败类 2020-12-19 08:56

One of the challenges on w3resources is to print pi to \'n\' decimal places. Here is my code:

from math import pi

fraser = str(pi)

length_of_pi = []

numbe         


        
7条回答
  •  盖世英雄少女心
    2020-12-19 09:21

    Your solution appears to be looping over the wrong thing:

    for number_of_places in fraser:
    

    For 9 places, this turns out be something like:

    for "9" in "3.141592653589793":
    

    Which loops three times, one for each "9" found in the string. We can fix your code:

    from math import pi
    
    fraser = str(pi)
    
    length_of_pi = []
    
    number_of_places = int(raw_input("Enter the number of decimal places you want: "))
    
    for places in range(number_of_places + 1):  # +1 for decimal point
        length_of_pi.append(str(fraser[places]))
    
    print "".join(length_of_pi)
    

    But this still limits n to be less than the len(str(math.pi)), less than 15 in Python 2. Given a serious n, it breaks:

    > python test.py
    Enter the number of decimal places you want to see: 100
    Traceback (most recent call last):
      File "test.py", line 10, in 
        length_of_pi.append(str(fraser[places]))
    IndexError: string index out of range
    > 
    

    To do better, we have to calculate PI ourselves -- using a series evaluation is one approach:

    # Rewrite of Henrik Johansson's (Henrik.Johansson@Nexus.Comm.SE)
    # pi.c example from his bignum package for Python 3
    #
    # Terms based on Gauss' refinement of Machin's formula:
    #
    # arctan(x) = x - (x^3)/3 + (x^5)/5 - (x^7)/7 + ...
    
    from decimal import Decimal, getcontext
    
    TERMS = [(12, 18), (8, 57), (-5, 239)]  # ala Gauss
    
    def arctan(talj, kvot):
    
        """Compute arctangent using a series approximation"""
    
        summation = 0
    
        talj *= product
    
        qfactor = 1
    
        while talj:
            talj //= kvot
            summation += (talj // qfactor)
            qfactor += 2
    
        return summation
    
    number_of_places = int(input("Enter the number of decimal places you want: "))
    getcontext().prec = number_of_places
    product = 10 ** number_of_places
    
    result = 0
    
    for multiplier, denominator in TERMS:
        denominator = Decimal(denominator)
        result += arctan(- denominator * multiplier, - (denominator ** 2))
    
    result *= 4  # pi == atan(1) * 4
    string = str(result)
    
    # 3.14159265358979E+15 => 3.14159265358979
    print(string[0:string.index("E")])
    

    Now we can take on a large value of n:

    > python3 test2.py
    Enter the number of decimal places you want: 100
    3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067
    > 
    

提交回复
热议问题