module Numeric (showFloat) where
import ShowGFloat
showFloat :: (RealFloat a) => a -> ShowS
showFloat = showGFloat Nothing
{-
-- All the code below is from a earlier version of the Numeric library.
-- It has now be replaced by the code above.
import Ratio(Ratio,Rational,(%))
-- The number of decimal digits m below is chosen to guarantee
-- read (show x) = x. See
-- Matula, D. W. A formalization of floating-point numeric base
-- conversion. IEEE Transactions on Computers C-19, 8 (1970 August),
-- 681-692.
showFloat:: (RealFloat a) => a -> ShowS
showFloat x = if x < 0 then showChar '-' . showFloat' (negate x) else showFloat' x
showFloat' x =
{- !!! Lennart use the following lines, don't know if they are standard !!!
if isNaN x then showString "NaN" else
if isInfinite x then showString "Infinity" else
-}
if x == 0 then showString ("0." ++ take (m-1) (repeat '0'))
else if e >= m-1 || e < 0 then showSci else showFix
where
showFix = showString whole . showChar '.' . showString frac
where (whole,frac) = splitAt (e+1) (show sig)
showSci = showChar d . showChar '.' . showString frac
. showChar 'e' . shows e
where (d:frac) = show sig
(m, sig, e) = if b == 10 then (w, s, n+w-1)
else (m', sig', e' )
m' :: Int
m' = ceiling
((fromIntegral w * log (fromInteger b)) / log (fromInteger 10) :: Double)
+ 1
(sig', e') = if sig1 >= (10::Integer)^m' then ((round (t/10))::Integer, e1+1)
else if sig1 < (10::Integer)^(m'-1) then ((round (t*10))::Integer, e1-1)
else (sig1, e1 )
sig1 :: Integer
sig1 = round t
t :: Rational
t = (s%1) * (b%1)^^n * 10^^(m'-e1-1)
e1 :: Int
e1 = floor (logBase 10 x)
(s, n) = decodeFloat x
b = floatRadix x
w = floatDigits x
-}
|