I like the document route; anyone who is happy with the performance tradeoff would be free to implement a more conservative version.
> On 17 Apr 2017, at 21:59, Ben Greenman <[email protected]> wrote: > > Maybe, just add a note to the docs? > >> On Mon, Apr 17, 2017 at 4:56 PM, Vincent St-Amour >> <[email protected]> wrote: >> The latter is easy to fix; I've submitted a pull request. >> >> The former is trickier. The problem is not so much due to the step size >> itself, but rather to a combination of the step size and of a particular >> iteration state. >> >> (For people following along, the issue is that there exists a value `x` >> such that `(= (+ x 1e-17) x)`, and that the iteration reaches that `x` >> as its state at some point, then loops.) >> >> Guarding against that would require an additional check at each >> iteration, which may introduce overhead. >> >> I did some very, very crude benchmarking, and here's what I got: >> >> Without extra check: >> > (time (for ([i (in-range 10000000000)]) i)) >> cpu time: 19478 real time: 19469 gc time: 0 >> > (time (for ([i (in-range 10000000000)]) i)) >> cpu time: 20171 real time: 20179 gc time: 0 >> > (time (for ([i (in-range 10000000000)]) i)) >> cpu time: 20049 real time: 20043 gc time: 0 >> >> With extra check: >> > (time (for ([i (in-range 10000000000)]) i)) >> cpu time: 22100 real time: 22210 gc time: 0 >> > (time (for ([i (in-range 10000000000)]) i)) >> cpu time: 22227 real time: 22265 gc time: 0 >> > (time (for ([i (in-range 10000000000)]) i)) >> cpu time: 21934 real time: 22016 gc time: 0 >> >> The difference is non-insignificant. Admittedly, this is the worst >> possible case, though. >> >> Vincent >> >> >> >> On Mon, 17 Apr 2017 09:17:32 -0500, >> Tim Jervis wrote: >> > >> > Dear Racket Users, >> > >> > I’ve noticed the following procedure calls don’t return (on my 64 bit Mac >> > hardware): >> > >> > 1 (range (- 1 1e-16) 1.0 1e-17) >> > 2 (range 0 1 0) >> > >> > While (2) is obvious, (1) tripped me up (as I hadn’t noticed my step size >> > had fallen to effectively zero). >> > >> > A small tweak to for.rkt in the racket distribution could trap the >> > condition of an actually or effectively zero step. for.rkt already traps >> > the condition where step is not real. >> > >> > If this makes sense, could one of the authors consider adding the tweak? >> > Or is there a reason for leaving it alone? >> > >> > Kind regards, >> > >> > Tim >> > >> > Tim Jervis >> > >> > http://timjervis.com/ >> > >> > -- >> > You received this message because you are subscribed to the Google Groups >> > "Racket Users" group. >> > To unsubscribe from this group and stop receiving emails from it, send an >> > email to [email protected]. >> > For more options, visit https://groups.google.com/d/optout. >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Racket Users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.

