base: showEFloat: Handle negative precisions the same of zero precision
authorBen Gamari <bgamari.foss@gmail.com>
Thu, 13 Sep 2018 21:09:56 +0000 (17:09 -0400)
committerBen Gamari <ben@smart-cactus.org>
Sun, 16 Sep 2018 19:46:29 +0000 (15:46 -0400)
Test Plan: Validate

Reviewers: hvr, alpmestan

Reviewed By: alpmestan

Subscribers: rwbarton, carter

GHC Trac Issues: #15509

Differential Revision: https://phabricator.haskell.org/D5083

(cherry picked from commit e71e341f87c055ecc01f85ddd8d7a2094dfa8e9a)

libraries/base/GHC/Float.hs

index 26a5987..8790a92 100644 (file)
@@ -729,16 +729,18 @@ formatRealFloatAlt fmt decs alt x
           [d]     -> d : ".0e" ++ show_e'
           (d:ds') -> d : '.' : ds' ++ "e" ++ show_e'
           []      -> errorWithoutStackTrace "formatRealFloat/doFmt/FFExponent: []"
-       Just 0 ->
+       Just d | d <= 0 ->
         -- handle this case specifically since we need to omit the
-        -- decimal point as well (#15115)
+        -- decimal point as well (#15115).
+        -- Note that this handles negative precisions as well for consistency
+        -- (see #15509).
         case is of
           [0] -> "0e0"
           _ ->
            let
              (ei,is') = roundTo base 1 is
-             d:_ = map intToDigit (if ei > 0 then init is' else is')
-           in d : 'e' : show (e-1+ei)
+             n:_ = map intToDigit (if ei > 0 then init is' else is')
+           in n : 'e' : show (e-1+ei)
        Just dec ->
         let dec' = max dec 1 in
         case is of