Front page | perl.perl6.users | Postings from April 2021

## Accurate conversion of Num to Rat (and comparing Num and Rat)

From:
sisyphus
Date:
April 6, 2021 01:09
Subject:
Accurate conversion of Num to Rat (and comparing Num and Rat)
Message ID:
```Hi,

With perl5 (configured with \$Config{nvtype} of "double") we can get a
rational expression of the exact value held (for example) by the double 0.1
by doing:

\$ perl -e 'printf "%.60g\n", 1.0e-1;'
0.1000000000000000055511151231257827021181583404541015625

How can we achieve the same in raku ?

I tried:

\$ raku -e 'printf "%.60g\n", 1.0e-1;'
0.1

and

\$ raku -e 'say sprintf "%.60g", 1.0e-1;'
0.1
\$ raku -e "say sprintf '<%.60g>', 1.0e-1;"
<0.1>

https://www.perlmonks.org/?node_id=11130768).
The "other issues" have been resolved in that thread, but (currently) not
this issue.

One other thing (which I believe I understand, but find to be odd) is that
raku asserts that the rational value 1/10 is equivalent to the double 0.1e0:

> say 1/10 == 0.1e0
True

I can see that for some (but not all) intents and purposes one might as
well consider a rational value to be equivalent to a double if (and only
if) the specified rational value rounds to the specified double value.
That's ok for interval arithmetic, but I don't think we're doing interval
arithmetic here.
And I don't think the "==" operator is the appropriate operator to be using
for such a comparison.

For example, it seems that raku regards the double 0.5 as representing a
non-precise value in the range 2**-1 plus or minus 2**-54 (ie the double
0.5 plus or minus 0.5ULP).
So we see:

> say 1/2 == 0.5e0
True
> say (2 ** -1 + 2 ** -54).nude
(9007199254740993 18014398509481984)
> say 9007199254740993/18014398509481984 == 0.5e0
True

This raku behaviour is also at odds with the mpfr library's mpfr_cmp_q()
library which will assert that 1/10 is not equivalent to the double 0.1,
and that 9007199254740993/18014398509481984 is not equivalent to the double
0.5.

Is there behaviour in other languages (eg python ?) that supports this
approach that raku has taken ?
Is there some raku documentation that discusses/elaborates/explains the
approach taken ?

Cheers,
Rob

```