Search code examples
bashshellseqbc

How can I calculate pi using Bash command


I am learning bash scripting. While exploring the math functions i am came across a command which calculated the value of pi.

seq -f '4/%g' 1 2 99999 | paste -sd-+ | bc -l

Although i understand how the basic seq command works, I am unable to understand how does the above command works. Can anybody please clarify how does it work.?


Solution

  • This calculates the value of π using Gregory–Leibniz series:

    enter image description here

    seq -f '4/%g' 1 2 99999 generates the fractions:

    4/1
    4/3
    4/5
    4/7
    4/9
    4/11
    4/13
    4/15
    4/17
    4/19
    

    The paste pipeline paste -sd-+ combines those with alternate delimiters - and +.

    Finally, bc -l performs the arithmetic to give the result.


    EDIT: As noted in the comment, this sequence converges very slowly. Machin's formula has a significantly higher rate of convergence:

    enter image description here

    Using the same expansion for tan-1(x):

    enter image description here

    to compute π, we can see that it produces the correct value to 50 digits1 using just the first 50 terms of the series:

    $ { echo -n "scale=50;"; seq 1 2 100 | xargs -n1 -I{} echo '(16*(1/5)^{}/{}-4*(1/239)^{}/{})';} | paste -sd-+ | bc -l
    3.14159265358979323846264338327950288419716939937510
    

    With just 100 terms, the value of π is computed accurately to more than 100 digits:

    $ { echo -n "scale=100;"; seq 1 2 200 | xargs -n1 -I{} echo '(16*(1/5)^{}/{}-4*(1/239)^{}/{})';} | paste -sd-+ | bc -l
    3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
    

    1 Pi