Should we consider making in-range signal an error for floats? I guess backwards compatibility says "no" but maybe in a future racket? With a note in the error message that points people in the right direction?<span></span><div><br></div><div>Robby<br><br>On Friday, February 27, 2015, Konrad Hinsen <<a href="mailto:konrad.hinsen@fastmail.net">konrad.hinsen@fastmail.net</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 26/02/2015 15:13, Neil Toronto wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
The second alternative is a little harder to get right because of<br>
fencepost errors [1]. Fortunately, Racket has a library function for it.<br>
Unfortunately, it's buried in `plot/utils`. Here it is in action:<br>
<br>
 > (require (only-in plot/utils linear-seq))<br>
<br>
 > (linear-seq 0.0 1.0 4)<br>
'(0.0 0.3333333333333333 0.6666666666666666 1.0)<br>
</blockquote>
<br>
That's the best solution in my opinion.<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I should really move this function into `math/base`.<br>
</blockquote>
<br>
Yes!<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
If you must use a flonum step size, do something like this:<br>
<br>
   (define (flonum-range start end step)<br>
     (define n (exact-ceiling (/ (- end start) step)))<br>
     (for/list ([i  (in-range 0 n)])<br>
       (+ start (* i step))))<br>
<br>
To get points with 0.5 ulp error each, which is the best you can do, add<br>
(require math/flonum) to your program and change the loop body to (flfma<br>
step (fl i) start).<br>
<br>
Arguably, `in-range` should do something like the above when given<br>
floating-point step lengths. I don't know how feasible that is, though.<br>
</blockquote>
<br>
It would obviously break backward compatibility. And it would complicate the rather simple mental model one can have of in-range.<br>
<br>
More fundamentally, I am not sure it would be much of an advantage. Think of the two kinds of users:<br>
<br>
1) Those who are not aware of the problem. They will still fall into the trap, only a bit later, and the cause of the problem will be even more hidden. It's a bit like languages that do decimal rounding of float output.<br>
<br>
2) Those who are aware of the problem. They would use linear-seq, but might prefer the modified in-range in specific situations for compactness.<br>
<br>
I suspect group 1) is the bigger one, so the most important measure is to promote linear-seq instead of in-range for floats.<br>
<br>
Konrad.<br>
<br>
____________________<br>
 Racket Users list:<br>
 <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/<u></u>users</a><br>
</blockquote></div>