http://www.perlmonks.org?node_id=1203857
freakcoco has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monk, I love perl6 number, it use rationals number by defulat.
But how about large number? can I use it by default?
some code like that:
my Rat @example =  1 , * ** 0.9999 ... Inf;
This work fine on  @example[^4]
But when the number going bigger , it will stored float point by default and type check fail.
How can i fix that?



fixed question: Addition 、 Subtraction 、Multiplication 、 Division 、 Modulo
my Rat @ex01 = 1.0 , * + 0.9999 ... Inf; my Rat @ex02 = 1.0 , * - 0.9999 ... Inf; my Rat @ex03 = 1.0 , * * 0.9999 ... Inf; my Rat @ex04 = 1.0 , * / 0.9999 ... Inf; my Rat @ex05 = 1.0 , * % 0.9999 ... Inf; my %ex = :add(@ex01), :substrat(@ex02), :mult(@ex03), div(@ex04), mod(@ex05); try { for < add substrat mult div mod > -> $op { for 1 .. 20 -> $count { .say; (%ex{$op})[$count] } } }
This try will fail in Multiplication and Division
Why?
How to fix it?

Replies are listed 'Best First'.
Re: perl6 rational number problem
by NetWallah (Canon) on Nov 21, 2017 at 05:42 UTC
    You will first need to fix your example. Here is what I get when I tried your syntax:
    > my Rat @example = 1 , * ** 0.9999 ... Inf; [...] > @example[^4] Type check failed in assignment to @example; expected Rat but got Int in block <unit> at <unknown file>:1
    So the initial assignment is failing because "1" is not a Rat. That piece can be fixed, and re-tried:

    > my Rat @example = 1.0, * ** 0.9999 ... Inf; [...] > @example[^4] Type check failed in assignment to @example; expected Rat but got Num in block <unit> at <unknown file>:1 > @example[0] 1
    A little further that time .. We successfully assigned "1" to @example[0], but that is all. The next element is a "Num", not a Rat, so the assignment failed.

    Another problem with the sequence is that it is not increasing to Infinity. Not sure what the intent is here.

    If you use an increasing Rat sequence, it works:

    > my Rat @example = 1.0, * += 0.9999 ... Inf; [...] > @example[^4] (1 1.9999 2.9998 3.9997)

                All power corrupts, but we need electricity.

      Yes
      I need to fix my question.
      exponentiation not in range of rational number(something like 2.sqrt() , and there have no exponentiation base stored in perl6 and most of program language, maybe there have moudle handle that)
      this is my question
      ration number on the common operator
      Addition 、 Subtraction 、Multiplication 、 Division 、 Modulo
      online run
      my Rat @ex01 = 1.0 , * + 0.9999 ... Inf; my Rat @ex02 = 1.0 , * - 0.9999 ... Inf; my Rat @ex03 = 1.0 , * * 0.9999 ... Inf; my Rat @ex04 = 1.0 , * / 0.9999 ... Inf; my Rat @ex05 = 1.0 , * % 0.9999 ... Inf; my %ex = :add(@ex01), :substrat(@ex02), :mult(@ex03), div(@ex04), mod(@ex05); try { for < add substrat mult div mod > -> $op { for 1 .. 20 -> $count { "$op $count".say; (%ex{$op})[$count] } } }
      this try will fail in Multiplication and Division.
      why?
        You need FatRats.
        > my @a = 1.0, * * 0.9999... *; [...] > my @b = FatRat(1.0), * * 0.9999... *; [...] > say $_, ' ', $_.WHAT for @a[^10]; 1 (Rat) 0.9999 (Rat) 0.99980001 (Rat) 0.999700029999 (Rat) 0.9996000599960001 (Rat) 0.99950009999 (Num) 0.999400149980001 (Num) 0.999300209965003 (Num) 0.999200279944007 (Num) 0.999100359916013 (Num) > say $_, ' ', $_.WHAT for @b[^10]; 1 (FatRat) 0.9999 (FatRat) 0.99980001 (FatRat) 0.999700029999 (FatRat) 0.9996000599960001 (FatRat) 0.99950009999000049999 (FatRat) 0.999400149980001499940001 (FatRat) 0.9993002099650034997900069999 (FatRat) 0.99920027994400699944002799920001 (FatRat) 0.999100359916012598740083996400089999 (FatRat)
Re: perl6 rational number problem
by Anonymous Monk on Nov 21, 2017 at 08:55 UTC
    You have to use FatRat instead of Rat.
    > my Rat $x = 0.9 ** 20; Type check failed in assignment to $x; expected Rat but got Num (0.121 +576654590569e0) > my FatRat $y = FatRat(0.9) ** 20; 0.12157665459056928801