Repository : ssh://darcs.haskell.org//srv/darcs/packages/base On branch : master
http://hackage.haskell.org/trac/ghc/changeset/86a8756db23b62346242916230736705c5053c55 >--------------------------------------------------------------- commit 86a8756db23b62346242916230736705c5053c55 Author: Paolo Capriotti <[email protected]> Date: Wed Jun 20 16:18:10 2012 +0100 Use round-to-even when formatting floats (#5963) Patch by Lennart Augustsson. >--------------------------------------------------------------- GHC/Float.lhs | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-) diff --git a/GHC/Float.lhs b/GHC/Float.lhs index dfa2365..48e3d49 100644 --- a/GHC/Float.lhs +++ b/GHC/Float.lhs @@ -636,20 +636,21 @@ formatRealFloat fmt decs x roundTo :: Int -> Int -> [Int] -> (Int,[Int]) roundTo base d is = - case f d is of + case f d True is of x@(0,_) -> x (1,xs) -> (1, 1:xs) _ -> error "roundTo: bad Value" where - b2 = base `div` 2 + b2 = base `quot` 2 - f n [] = (0, replicate n 0) - f 0 (x:_) = (if x >= b2 then 1 else 0, []) - f n (i:xs) + f n _ [] = (0, replicate n 0) + f 0 e (x:xs) | x == b2 && e && all (== 0) xs = (0, []) -- Round to even when at exactly half the base + | otherwise = (if x >= b2 then 1 else 0, []) + f n _ (i:xs) | i' == base = (1,0:ds) | otherwise = (0,i':ds) where - (c,ds) = f (n-1) xs + (c,ds) = f (n-1) (even i) xs i' = c + i -- Based on "Printing Floating-Point Numbers Quickly and Accurately" _______________________________________________ Cvs-libraries mailing list [email protected] http://www.haskell.org/mailman/listinfo/cvs-libraries
