develooper Front page | perl.perl6.users | Postings from April 2019

FatRat's falling back to Num's

Thread Next
From:
Laurent Rosenfeld via perl6-users
Date:
April 19, 2019 13:37
Subject:
FatRat's falling back to Num's
Message ID:
CAO=jjnotcrqDw4bNpcFBx+DuRZ-ijYL4T=Scgfa+TtCp4OiP7g@mail.gmail.com
Hello,

in the context of the Perl Weekly Challenge, I was trying to use one of
Franco-Canadian mathematician Simon Plouffe's formulas to compute the
digits of pi.

For this, I have written the following subroutine:

sub plouffe (Int $k) {
    my $result =   (1 / 16 ** $k) * (  (4 / (8 * $k + 1)) - (2 / (8 * $k +
4)) - (1 / (8 * $k + 5)) - (1 / (8 * $k + 6) )  );
}

With this, it should be possible to compute the pi decimals with something
like this:

> my $k = [+]  (plouffe $_ for 0..15)
3.141592653589793129614170564041344859
>

That doesn't work properly, however as the digitss are wrong after a
certain rank (16th). The reason seems to be that, after a while, rationals
are converted to floats and precision is lost:

> say (plouffe $_).WHAT for 0..15;
(Rat)
(Rat)
(Rat)
(Rat)
(Rat)
(Rat)
(Rat)
(Rat)
(Rat)
(Rat)
(Rat)
(Num)
(Num)
(Num)
(Num)
(Num)
>

So, for an input value of 11 or more, the plouffe subroutine returns a Num.

So I decided to try with FatRat:

sub plouffe (Int $k) {
    my $result = 1.FatRat *  (1 / 16 ** $k) * (  (4 / (8 * $k + 1)) - (2 /
(8 * $k + 4)) - (1 / (8 * $k + 5)) - (1 / (8 * $k + 6) )  );
}

It is a bit better, but I am again falling back to Num when the subroutine
input value reaches 17 or above:

> say (plouffe $_).WHAT for 0..20;
(FatRat)
(FatRat)
(FatRat)
(FatRat)
(FatRat)
(FatRat)
(FatRat)
(FatRat)
(FatRat)
(FatRat)
(FatRat)
(FatRat)
(FatRat)
(FatRat)
(FatRat)
(FatRat)
(Num)
(Num)
(Num)
(Num)
(Num)

Has anyone an idea why we are not keeping FatRat values all the way? Or, is
there a better way to guarantee that we continue to use FatRat's?

Note that I have found other ways of computing many pi digits, but the one
described above would be much simpler and much more elegant, if only it
worked OK. So my question is really not how to compute pi's digits, but
more this: why are the above computations falling from FatRat to Num after
a while, and is there something to do to keep FatRat calculation all the
way?

Thanks to anyone who would be able to shed light on this.

Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About