Search code examples
pythonpi

The Python Workbook: Exercise 69 - Approximate pi


I'm a new learner of Python and currently doing the Python Workbook by Ben Stephenson. I'm stuck with exercise 69 and my pi value is diverging.... can anyone help? Any errors with my code?

I've also attached the exercise question here. Exercise Question

#Exercise 69: Approximate pi

maxrun = 15
denominator1 = 2
denominator2 = 3
denominator3 = 4
fractionpos = (4/(denominator1*denominator2*denominator3))
denominatora = 4
denominatorb = 5
denominatorc = 6
fractionneg = -4/(denominatora*denominatorb*denominatorc)

pi = 3
count = 1

while maxrun != 0:
    if count %2 != 0:   #odd runs are positive
        pi = pi+fractionpos
        print('Approximation',count,'pi value is',pi)
        count = count+1
        denominator1 = denominator1+4
        denominator2 = denominator2+4
        denominator3 = denominator3+4
        maxrun = maxrun-1
    elif count %2 ==0:    #even runs are negative
        pi = pi+fractionneg
        print('Approximation',count,'pi value',pi)
        count = count+1
        denominatora = denominator1+4
        denominatorb = denominator2+4
        denominatorc = denominator3+4
        maxrun = maxrun-1

Solution

  • Each time you update your denominators, you'll need to also update your fraction. Right now your fractionpos and fractioneg are not changing and so each iteration, you are adding the original terms. This is why your pi approximation diverges.

    We can ammend this by updating fractionpos and fractionneg after updating our denominators.

    if count %2 != 0:   #odd runs are positive
        pi = pi+fractionpos
        print('Approximation',count,'pi value is',pi)
        count = count+1
        denominator1 = denominator1+4
        denominator2 = denominator2+4
        denominator3 = denominator3+4
        fractionpos = (4/(denominator1*denominator2*denominator3))
        maxrun = maxrun-1
    else:    #even runs are negative
        pi = pi+fractionneg
        print('Approximation',count,'pi value',pi)
        count = count+1
        denominatora = denominator1+4
        denominatorb = denominator2+4
        denominatorc = denominator3+4
        fractionneg = -4/(denominatora*denominatorb*denominatorc)
        maxrun = maxrun-1