[GHC] #13552: Enum Float/Double does not match Haskell Report
GHC
ghc-devs at haskell.org
Sun Apr 9 14:53:19 UTC 2017
#13552: Enum Float/Double does not match Haskell Report
-------------------------------------+-------------------------------------
Reporter: Luke | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: | Version: 8.0.1
libraries/base |
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: Incorrect result
Unknown/Multiple | at runtime
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
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
{{{#!hs
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
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13552>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list