Enum Float/Double does not match Haskell Report
Section 6.3.4 of the report says that the Enum
instance for Float
and
Double
should define the enumFromThen*
functions such that
enumFromThen e1 e2
is the list [e1, e1 + i, e1 + 2i, ...]
where i = e2 - e1
. The actual implementation in base is that of successive
additions (which is approximately the same thing for some types).
Successive additions causes issues with floating point rounding. Changing the definition to something like
enumFromThen_ e1 e2 = let i = e2 - e1 in map (\n -> e1 + n * i) [0..]
significantly improves the accuracy of floating point ranges, as well as **matching what the report says**.
Prelude> last $ take 101 $ [0,0.1..] :: Float
10.000028
Prelude> last $ take 101 $ enumFromThen_ 0 0.1 :: Float
10.0
Trac metadata
Trac field | Value |
---|---|
Version | 8.0.1 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | libraries/base |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |