Bug 4111 – Foreach ranges accept floating-point extrema

Status
RESOLVED
Resolution
WONTFIX
Severity
enhancement
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2010-04-21T14:01:40Z
Last change time
2022-03-22T12:50:49Z
Assigned to
No Owner
Creator
bearophile_hugs

Comments

Comment #0 by bearophile_hugs — 2010-04-21T14:01:40Z
This D2 code works with dmd 2.043, it shows that foreach accepts floating point extrema too. But I think it's safer/tidier to accept only ranges with integral extrema (in Python too the range/xrange expects integers). FP approximations can cause problems here. import std.stdio; import std.math: nextUp; void main() { foreach(i; 2.1 .. 4.10001) { writeln(typeid(typeof(i))); // Output: double break; } foreach(i; 2.1 .. nextUp(4.1)) write(i, " "); // Output: 2.1 3.1 4.1 }
Comment #1 by bearophile_hugs — 2010-04-22T02:09:06Z
Aelxx (aelxx at yandex dot ru) suggests: I'd like MATLAB style more: foreach (f; linspace (0.0, 1.0, 100)) {...} here f gets values 0, 0.0101.., 0.0202..., ..., 0.98989..., 1.0 foreach (f; logspace (1.0, 1e6, 7)) {...} here f gets values 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6. ------------------------ My answer: Phobos has iota() that's similar to what you ask, a FP version is easy to create. With iota even the current interval syntax becomes less useful. See also bug 4112.
Comment #2 by johannes.loher — 2018-05-05T11:59:34Z
This still works as of 2.080.0 and the spec indeed does not state that only integral extrema are allowed. This is legal code at the moment. I'll tag this as enhancement.
Comment #3 by razvan.nitu1305 — 2022-03-22T12:50:49Z
This issue has been filled a long time ago and there were no other complaints. Since it is possible that code in the wild uses this feature (in spite of FP approximations), I see no point in dissallowing it.