<div dir="ltr">Way back when I started with haskell I noticed this, and switched to using this:<div><br></div><div><div>-- | Enumerate an inclusive range.  Uses multiplication instead of successive</div><div>-- addition to avoid loss of precision.</div><div>--</div><div>-- Also it doesn't require an Enum instance.</div><div>range :: (Num a, Ord a) => a -> a -> a -> [a]</div><div>range start end step = go 0</div><div>    where</div><div>    go i</div><div>        | step >= 0 && val > end = []</div><div>        | step < 0 && val < end = []</div><div>        | otherwise = val : go (i+1)</div><div>        where val = start + (i*step)</div></div><div><br></div><div>It's always seemed better in every way, except syntax convenience.</div><div><br></div><div>Wouldn't any approach with successive addition lose precision?</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Aug 9, 2016 at 8:22 PM, Andrew Farmer <span dir="ltr"><<a href="mailto:xichekolas@gmail.com" target="_blank">xichekolas@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Noticed this today:<br>
<br>
ghci> let xs = [0.0,0.1 .. 86400.0] in maximum xs<br>
86400.0000005062<br>
<br>
enumFromThenTo is implemented by numericEnumFromThenTo:<br>
<br>
<a href="https://github.com/ghc/ghc/blob/a90085bd45239fffd65c01c24752a9bbcef346f1/libraries/base/GHC/Real.hs#L227" rel="noreferrer" target="_blank">https://github.com/ghc/ghc/<wbr>blob/<wbr>a90085bd45239fffd65c01c24752a9<wbr>bbcef346f1/libraries/base/GHC/<wbr>Real.hs#L227</a><br>
<br>
Which probably accumulates error in numericEnumFromThen with the (m+m-n):<br>
<br>
numericEnumFromThen n m = n `seq` m `seq` (n : numericEnumFromThen m (m+m-n))<br>
<br>
Why not define numericEnumFromThen as:<br>
<br>
numericEnumFromThen n m = let d = m - n in d `seq` go d n<br>
where go delta x = x `seq` (x : go delta (x + delta))<br>
<br>
(or with BangPatterns)<br>
<br>
numericEnumFromThen n m = go (m - n) n<br>
where go !delta !x = x : go delta (x + delta)<br>
<br>
Seems like we'd save a lot of subtractions by using the worker function.<br>
______________________________<wbr>_________________<br>
ghc-devs mailing list<br>
<a href="mailto:ghc-devs@haskell.org">ghc-devs@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/ghc-devs</a><br>
</blockquote></div><br></div>