The point of Rats is making Perl6 more correct and less surprising in
common cases, such as
$ perl6
> 1.1+2.2
> 1.1+2.2 == 3.3
> 1.1+2.2 != 3.3

vs any language using binary floating-point arithmetic

  DB<1> p 1.1+2.2
  DB<2> p 1.1+2.2 == 3.3

  DB<3> p 1.1+2.2 != 3.3

In that spirit, I'd expect numeric comparison in general, and epsilon
specifically, to be set so these return True:

> pi == pi.Rat # Does Num to Rat conversion keep its precision?
> pi.Str.Num == pi # Does Num survive string round-trip? - Nothing to do
with epsilon

On the other hand, the original poster Jim and I are both fiddling with the
language to see what it's doing with conversions- I'm are not coming across
this in an application.

What's the greatest value of epsilon that guarantees $x == $x.Rat for all
Num $x - and does that epsilon make denominators that are "too big?" My
understanding of floating point suggests that we should have an epsilon of
1/2**(mantissa bits-1). On a 64-bit platform that's 1/2**52 - for a 32-bit
float that's 1/2**23. Using a 64-bit Rakudo:

> pi.Rat(1/2**52) == pi  # Just enough precision to match this platform's
> pi.Rat(1/2**51) == pi  # Epsilon falling a bit short for precision

In terms of correctness, epsilon=1/2**(mantissa bits-1) looks like a
winner. Is that acceptable for size and speed?

and digressing, how to make "pi.Str.Num == pi" True?

Reply via email to