In celebration of Pi day, I thought I'd post some quick and dirty PowerShell code you can use to calculate pi. I found some easy to follow explanations at http://www.wikihow.com/Calculate-Pi that weren't too difficult to transform into PowerShell code. And you might even learn something new about PowerShell along the way.
ManageEngine ADManager Plus - Download Free Trial
Exclusive offer on ADManager Plus for US and UK regions. Claim now!
Before we begin, I hope you know that you can always get the value using the [Math] class:
But where's the fun in that? First up is my PowerShell version of Gregory-Leibniz series. This works by deriving pi from an infinite series.
π = (4/1) - (4/3) + (4/5) - (4/7) + (4/9) - (4/11) + (4/13) - (4/15)…
Seems simple enough. I need a large range of odd-numbered denominators. Then I need to alternately add and subtract. I'm going to need a loop and I can use the modulo operator (%) to test each time through the loop. If I am on an even number I'll add, otherwise I subtract. Here's what I came up with.
#total number of denominators to use $total = 10000 $a = 1 $d=@($a) #build array of odd numbers do { $a+=2 $d+=$a } until ($d.count -ge $total) $pi = 0 for ($i=0;$i -lt $d.count;$i++) { if ($i%2) { $pi-= 4/$d[$i] } else { $pi+= 4/$d[$i] } } $pi
This takes a little bit of time but it works.
Then I thought I'd try the Nilakantha series.
π = 3 + 4/(2*3*4) - 4/(4*5*6) + 4/(6*7*8) - 4/(8*9*10) + 4/(10*11*12) - 4/(12*13*14) ...
Some of the principals are the same. The tricky part here is looping through the collection of numbers and grouping them.
$n=2..10000 $pi = 3 #need a counter to to know whether to add or subtract $tick = 0 #loop through the numbers for ($i=0;$i -lt $n.count-1;$i+=2) { if ($tick%2) { $pi-= 4/($n[$i] * $n[$i+1] * $n[$i+2]) } else { $pi+= 4/($n[$i] * $n[$i+1] * $n[$i+2]) } $tick++ } $pi
This is noticeably faster and more accurate, well as far as you can be calculating an irrational number.
And the last way is using an Arcsine Function/Inverse Sine Function:
pi = 2 * (Arcsin(sqrt(1 - x^2))) + abs(Arcsin(x))
This gets a little tricky in PowerShell but it can be accomplished with the [Math] class. You have to watch out for the parentheses.
$x = 0.987654 $pi = 2 * (([math]::Asin([math]::Sqrt(1-([math]::Pow($x,2))))) + [math]::Abs([math]::Asin($x)))
The value of $x is between -1 and 1.
Also pretty quick, albeit a bit harder on the eyes to read.
Now if you'll excuse me I have some circles that need to be measured.