If you define a range as range[i] = first + i * stride where i is an Int then this generates an error when there are more than Int_Max steps, see code previously posted. The error is generated when the range is formed, which is ideal since an error part way along an iteration or a never ending iteration would be difficult to track down. <br><br>On Friday, 1 April 2016, Stephen Canon via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
&gt; On Mar 31, 2016, at 11:16 AM, Rainer Brockerhoff via swift-evolution &lt;<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;swift-evolution@swift.org&#39;)">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; On 3/31/16 15:06, Dave Abrahams via swift-evolution wrote:<br>
&gt;&gt;<br>
&gt;&gt; on Thu Mar 31 2016, Xiaodi Wu &lt;<a href="http://xiaodi.wu-AT-gmail.com" target="_blank">xiaodi.wu-AT-gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt;&gt; Thoughts on an edge case: so long as it&#39;s possible to use<br>
&gt;&gt;&gt; `stride(from:to:by:)` with Double, we&#39;ll need to figure out what<br>
&gt;&gt;&gt; happens when you have `stride(from: 0.0, to: DBL_MAX, by: DBL_MIN)`.<br>
&gt;&gt;&gt; Bounds may be unknown at compile time, obviously.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Currently (this is by reasoning through the code, not actually<br>
&gt;&gt;&gt; observing it run), `for i in stride(from: 0.0, to: DBL_MAX, by:<br>
&gt;&gt;&gt; DBL_MIN) { }` degenerates into an infinite loop once you reach<br>
&gt;&gt;&gt; sufficient large values such that `current + stride == current`, which<br>
&gt;&gt;&gt; for a stride of DBL_MIN should happen pretty quickly.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; In Erica&#39;s proposed floating point Stride, an Int is used to count<br>
&gt;&gt;&gt; iterations (and iterations need to be counted in order to avoid<br>
&gt;&gt;&gt; accumulating error). Thus, one must break from `for i in stride(from:<br>
&gt;&gt;&gt; 0.0, to: DBL_MAX, by: DBL_MIN) { }` before the iteration counter<br>
&gt;&gt;&gt; overflows or it will trap. IMO, trapping at some point is fine, but I<br>
&gt;&gt;&gt; think a limit of Int.max iterations might be rather arbitrary for a<br>
&gt;&gt;&gt; StrideTo&lt;Double&gt; (or whatever it will be named) and I&#39;m not sure how<br>
&gt;&gt;&gt; one can justify why the behavior of StrideTo&lt;Double&gt; would change from<br>
&gt;&gt;&gt; machine to machine based on the size of Int.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; I&#39;ve been waffling between using an Int counter as Erica does or a<br>
&gt;&gt;&gt; counter of type Strideable.Stride in `StrideTo&lt;Strideable where<br>
&gt;&gt;&gt; Strideable.Stride : FloatingPoint&gt;`. In the latter alternative, no<br>
&gt;&gt;&gt; trapping occurs, but error begins to accumulate when the iteration<br>
&gt;&gt;&gt; counter is too large to represent integers exactly (e.g., 2^53 for<br>
&gt;&gt;&gt; Double). In that case, `for i in stride(from: 0.0, to: DBL_MAX, by:<br>
&gt;&gt;&gt; DBL_MIN) { }` degenerates into an infinite loop eventually (once<br>
&gt;&gt;&gt; `iterationCount + 1.0 == iterationCount`) and never traps, which I&#39;m<br>
&gt;&gt;&gt; not sure I like, but a limit of 2^53 iterations bears at least a<br>
&gt;&gt;&gt; rational connection to Double and is known at compile time independent<br>
&gt;&gt;&gt; of the supplied bounds. We could alternatively return nil on reaching<br>
&gt;&gt;&gt; 2^53 iterations, trap, etc.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Comments?<br>
&gt;&gt;<br>
&gt;&gt; I think I want to hear Steve Canon&#39;s input on this one.  I defer to him<br>
&gt;&gt; on most things numeric.<br>
&gt;<br>
&gt; In particular, should Steve confirm that the IEEE754 Decimal128 format<br>
&gt; is being worked on, and if simple decimal constants like those in<br>
&gt;       `for i in stride(from: 0.0, to: DBL_MAX, by: DBL_MIN) { }`<br>
&gt; will be type-inferred as Decimal128, all that would &quot;just work&quot;.<br>
<br>
Decimal is something that I would like to see happen.  However, I would not expect any such proposal to result in that loop being type inferred to Decimal, since the to: and by: values are explicitly (binary floating-point) Doubles.<br>
<br>
I also don’t think that such a loop is particularly useful.  For floating-point types, something like stride(from: T, to: T, steps: Int) seems safer and more workable to me (this is just my immediate reaction, I haven’t thought this through in detail, and am likely to change my mind if someone makes a good case).<br>
<br>
– Steve<br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;swift-evolution@swift.org&#39;)">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</blockquote><br><br>-- <br>-- Howard.<br>