UNDO: Handle NaN, -Infinity and Infinity in the toRational for Float/Double (#3676)
authorSimon Marlow <marlowsd@gmail.com>
Tue, 23 Feb 2010 10:16:03 +0000 (10:16 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 23 Feb 2010 10:16:03 +0000 (10:16 +0000)
GHC/Float.lhs
GHC/Real.lhs

index 61d009f..dbb556f 100644 (file)
@@ -171,10 +171,7 @@ instance  Num Float  where
     fromInteger i = F# (floatFromInteger i)
 
 instance  Real Float  where
-    toRational x | isInfinite x     = if x < 0 then -infinity else infinity
-                 | isNaN x          = notANumber
-                 | isNegativeZero x = negativeZero
-                 | otherwise        = (m%1)*(b%1)^^n
+    toRational x        =  (m%1)*(b%1)^^n
                            where (m,n) = decodeFloat x
                                  b     = floatRadix  x
 
@@ -306,10 +303,7 @@ instance  Num Double  where
 
 
 instance  Real Double  where
-    toRational x | isInfinite x     = if x < 0 then -infinity else infinity
-                 | isNaN x          = notANumber
-                 | isNegativeZero x = negativeZero
-                 | otherwise        = (m%1)*(b%1)^^n
+    toRational x        =  (m%1)*(b%1)^^n
                            where (m,n) = decodeFloat x
                                  b     = floatRadix  x
 
@@ -719,7 +713,6 @@ fromRat (n :% 0) | n > 0     =  1/0        -- +Infinity
 
 fromRat (n :% d) | n > 0     = fromRat' (n :% d)
                  | n < 0     = - fromRat' ((-n) :% d)
-                 | d < 0     = 0/(-1)      -- -0.0
                  | otherwise = encodeFloat 0 0             -- Zero
 
 -- Conversion process:
index 71d35e6..971f276 100644 (file)
@@ -54,10 +54,9 @@ ratioPrec, ratioPrec1 :: Int
 ratioPrec  = 7  -- Precedence of ':%' constructor
 ratioPrec1 = ratioPrec + 1
 
-infinity, notANumber, negativeZero :: Rational
+infinity, notANumber :: Rational
 infinity   = 1 :% 0
 notANumber = 0 :% 0
-negativeZero = 0 :% (-1)
 
 -- Use :%, not % for Inf/NaN; the latter would 
 -- immediately lead to a runtime error, because it normalises.