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.

Reply via email to