Skip Menu |
Report information
Id: 128175
Status: rejected
Priority: 0/
Queue: perl6

Owner: Nobody
Requestors: cpan [at] zoffix.com
Cc:
AdminCc:

Severity: (no value)
Tag: (no value)
Platform: (no value)
Patch Status: (no value)
VM: (no value)



Subject: Potential For Infinite Loop in Real .polymod Due To Floating Point Math Imprecision
Download (untitled) / with headers
text/plain 2.4k
Current implementation of .polymod on Reals with lazy list divisors as arguments checks for whether the number operated on is exactly equals to zero before stopping: https://github.com/rakudo/rakudo/blob/51bbf66a34ae8208e6aa8f76347579bd70c34748/src/core/Real.pm#L73 This creates a potential for an infinite loop due to floating point math imprecision that introduces differences between the remained subtracted from the number and the resulting division. I believe the check should be changed from `last if $inf and not $more;` to `last if $inf and $more <= 0;`. Here is an example of the issue: $ perl6 -e 'say 4343434343.Num.polymod: 1/3 xx Inf' (2.41212546825409e-07 7.23637640476227e-07 2.16811895370483e-06 6.51180744171143e-06 1.95205211639404e-05 5.8591365814209e-05 0.000175714492797852 0.000527381896972656 0.00158119201660156 0.0047454833984375 0.0142364501953125 0.042724609375 0.128173828125 0.05126953125 1.15234375 -1.875 10.375 -32.875 -77.25 280 -1207 2524 -3360 864 68096 29440 613376 1839104 5513216 -17006592 4915200 148897792 -268959744 -92274688 -1707081728 603979776 36171677696 108582141952 325880643584 977105059840 -2933462663168 8796093022208 26388279066624 -14705968021504 -325455441821696 -38482906972160 2.13745060439654e+15 -1.16020466962924e+16 1.92458515325911e+16 5.77023702256845e+16 1.73107110677053e+17 -6.33881647552397e+17 1.55824547107019e+18 4.67473641321057e+18 1.4015202040377e+19 4.20816349181499e+19 -1.68903000424903e+20 -1.4987979559889e+19 -4.38110171750602e+20 -2.89152713355397e+21 -2.37962998550853e+21 -1.97011226707218e+22 -8.70686320279091e+21 -1.26913599227122e+23 8.27594726122905e+23 2.48396476998943e+24 1.00114169436836e+24 -3.4378827995291e+24 -8.76471219220606e+25 -5.13793473336217e+24 -6.3468605529768e+26 -1.48939660976522e+27 -1.17024019338696e+27 1.62866486418483e+28 -3.94593387522215e+27 4.10067638013282e+28 4.40087683965953e+29 1.31964408187822e+30 5.79355938385558e+29 -1.64398437217099e+30 -1.84601618658236e+31 1.06958019394257e+32 -1.11870165470141e+32 9.62146805573226e+32 2.88517276611945e+33 8.66058890075926e+33 2.59614842926741e+34 -3.28575035579157e+34 -4.30636120704732e+35 7.00960075902202e+35 2.10547637613587e+36 6.31383297997835e+36 4.7561439224179e+36 5.68244968198052e+37 1.70473490459415e+38 -3.96109942743905e+38 1.53392910713579e+39 4.60444577739895e+39 -7.01832381774436e+38 -1.6673835979126e+40 ...) $ perl6 -e 'put 4343434343.Num.polymod: 1/3 xx Inf' ^C # an nearly infinite loop
Download (untitled) / with headers
text/plain 164b
Rejecting this. The 1/3 divisor doesn't make sense, as it will be making the original number larger and larger and I can't reproduce any issues with a sane divisor.


This service is sponsored and maintained by Best Practical Solutions and runs on Perl.org infrastructure.

For issues related to this RT instance (aka "perlbug"), please contact perlbug-admin at perl.org