module Prelude where class (RealFrac a, Floating a) => RealFloat a where floatRadix :: a -> Integer floatDigits :: a -> Int floatRange :: a -> (Int,Int) decodeFloat :: a -> (Integer,Int) encodeFloat :: Integer -> Int -> a exponent :: a -> Int significand :: a -> a scaleFloat :: Int -> a -> a isNaN, isInfinite, isDenormalized, isNegativeZero, isIEEE :: a -> Bool atan2 :: a -> a -> a exponent x = case decodeFloat x of (m,n) -> if m == 0 then 0 else n + floatDigits x significand x = case decodeFloat x of (m,_) -> encodeFloat m (negate (floatDigits x)) scaleFloat k x = case decodeFloat x of (m,n) -> encodeFloat m (n+k) {- atan2 y x = case (signum y, signum x) of ( 0, 1) -> 0 ( 1, 0) -> pi/2 ( 0,(-1)) -> negate pi (-1, 0) -> negate pi/2 ( _, 1) -> atan (y/x) ( _,(-1)) -> atan (y/x) + pi ( 0, 0) -> error "Prelude.atan2: atan2 of origin" -} {- atan2 y x | y==0 && x>0 = 0 | y>0 && x==0 = pi/2 | y==0 && x<0 = negate pi | y<0 && x==0 = negate pi/2 | x>0 = atan (y/x) | x<0 = atan (y/x) + pi | y==0 && x==0 = error "Prelude.atan2: atan2 of origin" | otherwise = error "Prelude.atan2: not a number" -- The following is the specification of atan2 from the Haskell Report. -- However, because we don't implement isNegativeZero, this will always -- fail. Hence, the alternative implementation given above. -} -- Now that we have implemented isNegativeZero, the Report code is now valid. atan2 y x | x>0 = atan (y/x) | x==0 && y>0 = pi / 2 | x<0 && y>0 = pi + atan (y/x) |(x<=0 && isNegativeZero y) || (isNegativeZero x && isNegativeZero y) = negate (atan2 (negate y) x) | y==0 && (x<0 || isNegativeZero x) = pi -- must be after the previous test on zero y | x==0 && y==0 = y -- must be after the other double zero tests | otherwise = x + y -- x or y is a NaN, return a NaN (via +)