Perl / perl5

🐪 The Perl programming language
https://dev.perl.org/perl5/
Other
1.94k stars 554 forks source link

IRIX longdouble Infinity issues #14993

Closed p5pRT closed 9 years ago

p5pRT commented 9 years ago

Migrated from rt.perl.org#126396 (status was 'resolved')

Searchable as RT126396$

p5pRT commented 9 years ago

From @jhi

(blead as of 033a6f7a)

Looks like IRIX long double (which happens to be big-endian double-double\, but not using PPC as usual\, but instead MIPS)\, has some issues with infinities.

(1) If infinities are involved\, multiplication is producing garbage bytes in the second double of the double-double.

If I add byte hexdumps for the NV in Perl_do_ncmp (which is called by pp_eq) I can see for example​:

./perl -wle '"Inf"*1 == "Inf"+0' 7f f0 00 00 00 00 00 00 3f f0 00 00 00 00 00 00 7f f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00

./perl -wle '"Inf"*"Inf" == "Inf"+0' 7f f0 00 00 00 00 00 00 7f ef ff ff ff ff ff ff 7f f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00

The "7f f0" prefix is correct\, and all that is needed for an infinity\, the rest of the bytes should be zeros.

The "3f f0" and "7f ef ff ... ff" after the midpoint (the second double of double-double) are unexpected garbage.

(2) Then comparison of infinities (pp_eq\, the last branch which compares NVs) seems to have issues​: if e.g. the above bogus infinity

7f f0 00 00 00 00 00 00 3f f0 00 00 00 00 00 00

is compared with the true infinity\, the bogus one is deemed to be "greater than"\, presumably because of the non-zero bytes.

Because of these together\, the following t/op/infnan.t tests are failing​:

not ok 14 - twice Inf is Inf not ok 16 - +Inf * +Inf is +Inf not ok 17 - +Inf * -Inf is -Inf not ok 18 - -Inf * +Inf is -Inf not ok 19 - -Inf * -Inf is +Inf

Note that this is all with long doubles​: with normal doubles\, no problems in IRIX.

p5pRT commented 9 years ago

From @jhi

On Sun Oct 18 19​:31​:02 2015\, jhi wrote​:

(blead as of 033a6f7a)

Looks like IRIX long double (which happens to be big-endian double- double\, but not using PPC as usual\, but instead MIPS)\, has some issues with infinities.

(1) If infinities are involved\, multiplication is producing garbage bytes in the second double of the double-double.

If I add byte hexdumps for the NV in Perl_do_ncmp (which is called by pp_eq) I can see for example​:

./perl -wle '"Inf"*1 == "Inf"+0' 7f f0 00 00 00 00 00 00 3f f0 00 00 00 00 00 00 7f f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00

./perl -wle '"Inf"*"Inf" == "Inf"+0' 7f f0 00 00 00 00 00 00 7f ef ff ff ff ff ff ff 7f f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00

The "7f f0" prefix is correct\, and all that is needed for an infinity\, the rest of the bytes should be zeros.

The "3f f0" and "7f ef ff ... ff" after the midpoint (the second double of double-double) are unexpected garbage.

(2) Then comparison of infinities (pp_eq\, the last branch which compares NVs) seems to have issues​: if e.g. the above bogus infinity

7f f0 00 00 00 00 00 00 3f f0 00 00 00 00 00 00

is compared with the true infinity\, the bogus one is deemed to be "greater than"\, presumably because of the non-zero bytes.

Because of these together\, the following t/op/infnan.t tests are failing​:

not ok 14 - twice Inf is Inf not ok 16 - +Inf * +Inf is +Inf not ok 17 - +Inf * -Inf is -Inf not ok 18 - -Inf * +Inf is -Inf not ok 19 - -Inf * -Inf is +Inf

Note that this is all with long doubles​: with normal doubles\, no problems in IRIX.

Resolved in http​://perl5.git.perl.org/perl.git/commit/3ec400f5ce53ea1a56d283bc6bf59e75762df058

p5pRT commented 9 years ago

@jhi - Status changed from 'new' to 'resolved'