The point of Rats is making Perl6 more correct and less surprising in common cases, such as $ perl6 > 1.1+2.2 3.3 > 1.1+2.2 == 3.3 True > 1.1+2.2 != 3.3 False
vs any language using binary floating-point arithmetic DB<1> p 1.1+2.2 3.3 DB<2> p 1.1+2.2 == 3.3 DB<3> p 1.1+2.2 != 3.3 1 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? False > pi.Str.Num == pi # Does Num survive string round-trip? - Nothing to do with epsilon False 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 Num True > pi.Rat(1/2**51) == pi # Epsilon falling a bit short for precision False 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?