# New Ticket Created by  Zoffix Znet 
# Please include the string:  [perl #128175]
# in the subject line of all future correspondence about this issue. 
# <URL: https://rt.perl.org/Ticket/Display.html?id=128175 >


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.2759472612290
 5e+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

Reply via email to