Normally, I'd probably use Pi, sine and cosine to draw things, but instead, I flashed on a couple ways to estimate Pi.
Also, showing you can use Unicode characters in Perl.
#!/usr/bin/env perl use feature qw{ say } ; use strict ; use warnings ; use utf8 ; my $π = 3.14159 ; my $est2 = estimate_2() ; my $diff2 = sprintf '%.5f',abs $π - $est2 ; say qq{Estimate 2: $est2 - off by $diff2} ; my $est1 = estimate_1() ; my $diff1 = sprintf '%.5f',abs $π - $est1 ; say qq{Estimate 1: $est1 - off by $diff1} ; exit ; # concept here is that the area of a circle = π * rsquared # if r == 1, area = π. If we just take the part of the circle # where x and y are positive, that'll be π/4. So, take a random # point between 0,0 and 1,1 see if the distance between it and # 0,0 is < 1. If so, we increment, and the count / the number # so far is an estimate of π. # because randomness, this will change each time you run it sub estimate_1 { srand ; my $inside = 0.0 ; my $pi ; for my $i ( 1 .. 1_000_000 ) { my $x = rand ; my $y = rand ; $inside++ if $x * $x + $y * $y < 1.0 ; $pi = sprintf '%.5f', 4 * $inside / $i ; } return $pi ; } # concept here is that π can be estimated by 4 ( 1 - 1/3 + 1/5 - 1/7 ...) # so we get closer the further we go sub estimate_2 { my $pi = 0; my $c = 0; for my $i ( 0 .. 1_000_000 ) { my $j = 2 * $i + 1 ; if ( $i % 2 == 1 ) { $c -= 1 / $j ; } else { $c += 1 / $j ; } $pi = sprintf '%.5f', 4 * $c ; } return $pi ; }
No comments:
Post a Comment