Hi,

C:\>raku -e "say 1.8446744073709552e+19 == 18446744073709551615"
True

I think I understand why raku deems this to be true.
The LHS is 0x1p+64, which is identical to the double that the RHS rounds to.
(AFAIK, it's the same with perl5 and C.)

Of course, for all $x in the Int range of  18446744073709551615 - 1023 to
18446744073709551615, we find that "1.8446744073709552e+19 == $x" is True,
because each of those $x Int values round to 0x1p+64.
I understand all of that (I think).

What I don't understand is the following:

C:\>raku -e "say 1.8446744073709552e+19 == (18446744073709551615 - 1024)"
True

C:\>raku -e "say 1.8446744073709552e+19 == (18446744073709551615 - 1087)"
True

For those particular Int values (and all Int values in between) the RHS
rounds to 0x1.fffffffffffffp+63,
and the result should therefore be "False" ... but it is reported as "True".

It's not until we subtract at least 1088 that the behaviour I'm expecting
appears:

C:\>raku -e "say 1.8446744073709552e+19 == (18446744073709551615 - 1088)"
False

Comparing the RHS Int values given in the last 2 one liners, I find they
are (respectively):
0.1111111111111111111111111111111111111111111111111111101111000000E64
0.1111111111111111111111111111111111111111111111111111101110111111E64

It's not apparent to me how those 2 integer values can round to different
doubles.
Those 2 integer values can also be written as (respectively):
18446744073709550528
18446744073709550527

On Windows, I have:
C:\>raku --version
This is Rakudo version 2020.05.1 built on MoarVM version 2020.05
implementing Raku 6.d.

On Ubuntu, I have:
$ raku --version
Welcome to Rakudo(tm) v2021.03.
Implementing the Raku(tm) programming language v6.d.
Built on MoarVM version 2021.03.

It's the same behaviour on both systems.

Is this a bug that I ought to report ?

Cheers,
Rob

Reply via email to