Pi is 3.14159 to 5 decimal places.

To work out Pi, we will be using Leibniz’s formula:

X = 4 – 4/3 + 4/5 – 4/7 + 4/9 – …

This series converges to Pi, the more terms that are added to the series, the closer the value is to Pi.

For the proof on why this series converges to Pi – https://proofwiki.org/wiki/Leibniz%27s_Formula_for_Pi

There are several points to note about the series:

- It’s infinite, we need to find a way to continue adding term after term.
- The denominator of the fraction increases by 2 every term.
- The terms alternate between positive and negative.

Firstly, let’s create a function called pi.

To continue adding terms, let’s use a for loop. Every time the loop executes another term is added.

range(1,10) will produce the numbers 1, 2, … 9, 10.

However, before the loops starts, our variables’ initial values need to be set.

The pi series will start from 0.

n represents the numerator of our fractions which is the constant 4.

d represents the denominator of our fractions which starts as 1.

d needs to increase by 2 every loop, let’s use sum equals to do this.

Pi will also use a sum equals, **a** denotes our positive/negative function which we will get on to:

The only problem left is how to get **a** to alternate between 1 and -1.

This is where we introduce modulo.

Modulo outputs the remainder of a division and is denoted by %.

This example shows from numbers 1 to 4, modulo 2 alternates between 0 and 1.

If we multiple by 2 and minus 1 it will alternate between 1 and -1 which is what we require.

Putting everything together gives:

This isn’t close to 3.14159 at all.

However, we are only executing the loop 10 times, hence only 10 terms are being used to calculate Pi.

Increasing the number of loops to a million will change this:

There it is! A function written from scratch to calculate Pi.

To get a value even closer to Pi just increase the number of loops.

Finally, if you do wish to use Pi in python the easiest way is to use the numpy library, which has a pi constant stored.

great!

For me it returns 3.1516934060711166 with range(1,100) IS this a python 3 new thing?

Hi Jack,

I have run the same code and that’s correct.

My examples included range(1, 10) &

range(1, 1000000).

The more terms the closer to pi the series becomes.

range(1, 10) – 3.25237

range(1, 100) – 3.15169

range(1, 1000) – 3.14259

range(1,1000000) – 3.14159

I use this using random number to calculate pi

import random

c=0

iterations = input(‘what\’s the number of interations?’)

for number in range(0, int(iterations)):

x = random.random()

y = random.random()

pi = (x * x + y * y)

if pi <= 1:

c = c + 1

print('pi = ' , (c/float(iterations)*4))

thanks so much! really helpful and informative

I’m using

2(arctan(1/4)-arctan(-4)) = 2(arctan(1/4)+arctan(4)) =

Sum[(-1/4),{k,0,∞}]^k((1/(2k+1))+(2/(4k+1))+(1/(4k+3)))

Why not use Python’s generator expression to implement Leibniz formula for π (one liner :)) :

4*sum(pow(-1, k)/(2*k + 1) for k in range (10000))

Hi Jon, I really appreciate this presentation of using Python to do something I consider wonderful.

Following through your development was an extremely pleasant learning experience. Thanks.