[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