2 % (c) The AQUA Project, Glasgow University, 1994-1996
5 \section[PrelNum]{Module @PrelNum@}
7 Numeric part of the prelude.
12 {-# OPTIONS -fno-implicit-prelude -#include "cbits/floatExtreme.h" #-}
15 #include "../includes/ieee-flpt.h"
24 import {-# SOURCE #-} PrelErr ( error )
28 import PrelArr ( Array, array, (!) )
29 import PrelUnsafe ( unsafePerformIO )
31 import PrelCCall () -- we need the definitions of CCallable and
32 -- CReturnable for the _ccall_s herein.
36 infixl 7 /, %, `quot`, `rem`, `div`, `mod`
40 %*********************************************************
42 \subsection{Standard numeric classes}
44 %*********************************************************
47 class (Num a, Ord a) => Real a where
48 toRational :: a -> Rational
50 class (Real a, Enum a) => Integral a where
51 quot, rem, div, mod :: a -> a -> a
52 quotRem, divMod :: a -> a -> (a,a)
53 toInteger :: a -> Integer
54 toInt :: a -> Int -- partain: Glasgow extension
56 n `quot` d = q where (q,r) = quotRem n d
57 n `rem` d = r where (q,r) = quotRem n d
58 n `div` d = q where (q,r) = divMod n d
59 n `mod` d = r where (q,r) = divMod n d
60 divMod n d = if signum r == negate (signum d) then (q-1, r+d) else qr
61 where qr@(q,r) = quotRem n d
63 class (Num a) => Fractional a where
66 fromRational :: Rational -> a
70 class (Fractional a) => Floating a where
72 exp, log, sqrt :: a -> a
73 (**), logBase :: a -> a -> a
74 sin, cos, tan :: a -> a
75 asin, acos, atan :: a -> a
76 sinh, cosh, tanh :: a -> a
77 asinh, acosh, atanh :: a -> a
79 x ** y = exp (log x * y)
80 logBase x y = log y / log x
83 tanh x = sinh x / cosh x
85 class (Real a, Fractional a) => RealFrac a where
86 properFraction :: (Integral b) => a -> (b,a)
87 truncate, round :: (Integral b) => a -> b
88 ceiling, floor :: (Integral b) => a -> b
90 truncate x = m where (m,_) = properFraction x
92 round x = let (n,r) = properFraction x
93 m = if r < 0 then n - 1 else n + 1
94 in case signum (abs r - 0.5) of
96 0 -> if even n then n else m
99 ceiling x = if r > 0 then n + 1 else n
100 where (n,r) = properFraction x
102 floor x = if r < 0 then n - 1 else n
103 where (n,r) = properFraction x
105 class (RealFrac a, Floating a) => RealFloat a where
106 floatRadix :: a -> Integer
107 floatDigits :: a -> Int
108 floatRange :: a -> (Int,Int)
109 decodeFloat :: a -> (Integer,Int)
110 encodeFloat :: Integer -> Int -> a
112 significand :: a -> a
113 scaleFloat :: Int -> a -> a
114 isNaN, isInfinite, isDenormalized, isNegativeZero, isIEEE
117 exponent x = if m == 0 then 0 else n + floatDigits x
118 where (m,n) = decodeFloat x
120 significand x = encodeFloat m (negate (floatDigits x))
121 where (m,_) = decodeFloat x
123 scaleFloat k x = encodeFloat m (n+k)
124 where (m,n) = decodeFloat x
127 %*********************************************************
129 \subsection{Overloaded numeric functions}
131 %*********************************************************
134 even, odd :: (Integral a) => a -> Bool
135 even n = n `rem` 2 == 0
138 {-# GENERATE_SPECS gcd a{Int#,Int,Integer} #-}
139 gcd :: (Integral a) => a -> a -> a
140 gcd 0 0 = error "Prelude.gcd: gcd 0 0 is undefined"
141 gcd x y = gcd' (abs x) (abs y)
143 gcd' x y = gcd' y (x `rem` y)
145 {-# GENERATE_SPECS lcm a{Int#,Int,Integer} #-}
146 lcm :: (Integral a) => a -> a -> a
149 lcm x y = abs ((x `quot` (gcd x y)) * y)
151 (^) :: (Num a, Integral b) => a -> b -> a
153 x ^ n | n > 0 = f x (n-1) x
155 f x n y = g x n where
156 g x n | even n = g (x*x) (n `quot` 2)
157 | otherwise = f x (n-1) (x*y)
158 _ ^ _ = error "Prelude.^: negative exponent"
160 (^^) :: (Fractional a, Integral b) => a -> b -> a
161 x ^^ n = if n >= 0 then x^n else recip (x^(negate n))
163 fromIntegral :: (Integral a, Num b) => a -> b
164 fromIntegral = fromInteger . toInteger
166 fromRealFrac :: (RealFrac a, Fractional b) => a -> b
167 fromRealFrac = fromRational . toRational
169 atan2 :: (RealFloat a) => a -> a -> a
170 atan2 y x = case (signum y, signum x) of
174 (-1, 0) -> (negate pi)/2
175 ( _, 1) -> atan (y/x)
176 ( _,-1) -> atan (y/x) + pi
177 ( 0, 0) -> error "Prelude.atan2: atan2 of origin"
181 %*********************************************************
183 \subsection{Instances for @Int@}
185 %*********************************************************
188 instance Real Int where
189 toRational x = toInteger x % 1
191 instance Integral Int where
192 a@(I# _) `quotRem` b@(I# _) = (a `quotInt` b, a `remInt` b)
193 -- OK, so I made it a little stricter. Shoot me. (WDP 94/10)
195 -- Following chks for zero divisor are non-standard (WDP)
196 a `quot` b = if b /= 0
198 else error "Integral.Int.quot{PreludeCore}: divide by 0\n"
199 a `rem` b = if b /= 0
201 else error "Integral.Int.rem{PreludeCore}: divide by 0\n"
203 x `div` y = if x > 0 && y < 0 then quotInt (x-y-1) y
204 else if x < 0 && y > 0 then quotInt (x-y+1) y
206 x `mod` y = if x > 0 && y < 0 || x < 0 && y > 0 then
207 if r/=0 then r+y else 0
212 divMod x@(I# _) y@(I# _) = (x `div` y, x `mod` y)
213 -- Stricter. Sorry if you don't like it. (WDP 94/10)
215 --OLD: even x = eqInt (x `mod` 2) 0
216 --OLD: odd x = neInt (x `mod` 2) 0
218 toInteger (I# n#) = int2Integer# n# -- give back a full-blown Integer
224 %*********************************************************
226 \subsection{Type @Integer@}
228 %*********************************************************
230 These types are used to return from integer primops
233 data Return2GMPs = Return2GMPs Int# Int# ByteArray# Int# Int# ByteArray#
234 data ReturnIntAndGMP = ReturnIntAndGMP Int# Int# Int# ByteArray#
240 instance Eq Integer where
241 (J# a1 s1 d1) == (J# a2 s2 d2)
242 = (cmpInteger# a1 s1 d1 a2 s2 d2) ==# 0#
244 (J# a1 s1 d1) /= (J# a2 s2 d2)
245 = (cmpInteger# a1 s1 d1 a2 s2 d2) /=# 0#
247 instance Ord Integer where
248 (J# a1 s1 d1) <= (J# a2 s2 d2)
249 = (cmpInteger# a1 s1 d1 a2 s2 d2) <=# 0#
251 (J# a1 s1 d1) < (J# a2 s2 d2)
252 = (cmpInteger# a1 s1 d1 a2 s2 d2) <# 0#
254 (J# a1 s1 d1) >= (J# a2 s2 d2)
255 = (cmpInteger# a1 s1 d1 a2 s2 d2) >=# 0#
257 (J# a1 s1 d1) > (J# a2 s2 d2)
258 = (cmpInteger# a1 s1 d1 a2 s2 d2) ># 0#
260 x@(J# a1 s1 d1) `max` y@(J# a2 s2 d2)
261 = if ((cmpInteger# a1 s1 d1 a2 s2 d2) ># 0#) then x else y
263 x@(J# a1 s1 d1) `min` y@(J# a2 s2 d2)
264 = if ((cmpInteger# a1 s1 d1 a2 s2 d2) <# 0#) then x else y
266 compare (J# a1 s1 d1) (J# a2 s2 d2)
267 = case cmpInteger# a1 s1 d1 a2 s2 d2 of { res# ->
268 if res# <# 0# then LT else
269 if res# ># 0# then GT else EQ
272 instance Num Integer where
273 (+) (J# a1 s1 d1) (J# a2 s2 d2)
274 = plusInteger# a1 s1 d1 a2 s2 d2
276 (-) (J# a1 s1 d1) (J# a2 s2 d2)
277 = minusInteger# a1 s1 d1 a2 s2 d2
279 negate (J# a s d) = negateInteger# a s d
281 (*) (J# a1 s1 d1) (J# a2 s2 d2)
282 = timesInteger# a1 s1 d1 a2 s2 d2
284 -- ORIG: abs n = if n >= 0 then n else -n
287 = case 0 of { J# a2 s2 d2 ->
288 if (cmpInteger# a1 s1 d1 a2 s2 d2) >=# 0#
290 else negateInteger# a1 s1 d1
293 signum n@(J# a1 s1 d1)
294 = case 0 of { J# a2 s2 d2 ->
296 cmp = cmpInteger# a1 s1 d1 a2 s2 d2
299 else if cmp ==# 0# then 0
305 fromInt (I# n#) = int2Integer# n# -- gives back a full-blown Integer
307 instance Real Integer where
310 instance Integral Integer where
311 quotRem (J# a1 s1 d1) (J# a2 s2 d2)
312 = case (quotRemInteger# a1 s1 d1 a2 s2 d2) of
313 Return2GMPs a3 s3 d3 a4 s4 d4
314 -> (J# a3 s3 d3, J# a4 s4 d4)
316 {- USING THE UNDERLYING "GMP" CODE IS DUBIOUS FOR NOW:
318 divMod (J# a1 s1 d1) (J# a2 s2 d2)
319 = case (divModInteger# a1 s1 d1 a2 s2 d2) of
320 Return2GMPs a3 s3 d3 a4 s4 d4
321 -> (J# a3 s3 d3, J# a4 s4 d4)
324 toInt (J# a s d) = case (integer2Int# a s d) of { n# -> I# n# }
326 -- the rest are identical to the report default methods;
327 -- you get slightly better code if you let the compiler
328 -- see them right here:
329 n `quot` d = if d /= 0 then q else
330 error "Integral.Integer.quot{PreludeCore}: divide by 0\n"
331 where (q,r) = quotRem n d
332 n `rem` d = if d /= 0 then r else
333 error "Integral.Integer.quot{PreludeCore}: divide by 0\n"
334 where (q,r) = quotRem n d
335 n `div` d = q where (q,r) = divMod n d
336 n `mod` d = r where (q,r) = divMod n d
338 divMod n d = case (quotRem n d) of { qr@(q,r) ->
339 if signum r == negate (signum d) then (q - 1, r+d) else qr }
340 -- Case-ified by WDP 94/10
342 instance Enum Integer where
343 toEnum n = toInteger n
345 enumFrom n = n : enumFrom (n + 1)
346 enumFromThen m n = en' m (n - m)
347 where en' m n = m : en' (m + n) n
348 enumFromTo n m = takeWhile (<= m) (enumFrom n)
349 enumFromThenTo n m p = takeWhile (if m >= n then (<= p) else (>= p))
352 instance Show Integer where
353 showsPrec x = showSignedInteger x
354 showList = showList__ (showsPrec 0)
356 instance Ix Integer where
359 | inRange b i = fromInteger (i - m)
360 | otherwise = error "Integer.index: Index out of range."
361 inRange (m,n) i = m <= i && i <= n
363 integer_0, integer_1, integer_2, integer_m1 :: Integer
364 integer_0 = int2Integer# 0#
365 integer_1 = int2Integer# 1#
366 integer_2 = int2Integer# 2#
367 integer_m1 = int2Integer# (negateInt# 1#)
371 %*********************************************************
373 \subsection{Type @Float@}
375 %*********************************************************
378 instance Eq Float where
379 (F# x) == (F# y) = x `eqFloat#` y
381 instance Ord Float where
382 (F# x) `compare` (F# y) | x `ltFloat#` y = LT
383 | x `eqFloat#` y = EQ
386 (F# x) < (F# y) = x `ltFloat#` y
387 (F# x) <= (F# y) = x `leFloat#` y
388 (F# x) >= (F# y) = x `geFloat#` y
389 (F# x) > (F# y) = x `gtFloat#` y
391 instance Num Float where
392 (+) x y = plusFloat x y
393 (-) x y = minusFloat x y
394 negate x = negateFloat x
395 (*) x y = timesFloat x y
397 | otherwise = negateFloat x
398 signum x | x == 0.0 = 0
400 | otherwise = negate 1
401 fromInteger n = encodeFloat n 0
402 fromInt i = int2Float i
404 instance Real Float where
405 toRational x = (m%1)*(b%1)^^n
406 where (m,n) = decodeFloat x
409 instance Fractional Float where
410 (/) x y = divideFloat x y
411 fromRational x = fromRat x
414 instance Floating Float where
415 pi = 3.141592653589793238
428 (**) x y = powerFloat x y
429 logBase x y = log y / log x
431 asinh x = log (x + sqrt (1.0+x*x))
432 acosh x = log (x + (x+1.0) * sqrt ((x-1.0)/(x+1.0)))
433 atanh x = log ((x+1.0) / sqrt (1.0-x*x))
435 instance RealFrac Float where
437 {-# SPECIALIZE properFraction :: Float -> (Int, Float) #-}
438 {-# SPECIALIZE truncate :: Float -> Int #-}
439 {-# SPECIALIZE round :: Float -> Int #-}
440 {-# SPECIALIZE ceiling :: Float -> Int #-}
441 {-# SPECIALIZE floor :: Float -> Int #-}
443 {-# SPECIALIZE properFraction :: Float -> (Integer, Float) #-}
444 {-# SPECIALIZE truncate :: Float -> Integer #-}
445 {-# SPECIALIZE round :: Float -> Integer #-}
446 {-# SPECIALIZE ceiling :: Float -> Integer #-}
447 {-# SPECIALIZE floor :: Float -> Integer #-}
450 = case (decodeFloat x) of { (m,n) ->
451 let b = floatRadix x in
453 (fromInteger m * fromInteger b ^ n, 0.0)
455 case (quotRem m (b^(negate n))) of { (w,r) ->
456 (fromInteger w, encodeFloat r n)
460 truncate x = case properFraction x of
463 round x = case properFraction x of
465 m = if r < 0.0 then n - 1 else n + 1
466 half_down = abs r - 0.5
468 case (compare half_down 0.0) of
470 EQ -> if even n then n else m
473 ceiling x = case properFraction x of
474 (n,r) -> if r > 0.0 then n + 1 else n
476 floor x = case properFraction x of
477 (n,r) -> if r < 0.0 then n - 1 else n
479 instance RealFloat Float where
480 floatRadix _ = FLT_RADIX -- from float.h
481 floatDigits _ = FLT_MANT_DIG -- ditto
482 floatRange _ = (FLT_MIN_EXP, FLT_MAX_EXP) -- ditto
485 = case decodeFloat# f# of
486 ReturnIntAndGMP exp# a# s# d# ->
487 (J# a# s# d#, I# exp#)
489 encodeFloat (J# a# s# d#) (I# e#)
490 = case encodeFloat# a# s# d# e# of { flt# -> F# flt# }
492 exponent x = case decodeFloat x of
493 (m,n) -> if m == 0 then 0 else n + floatDigits x
495 significand x = case decodeFloat x of
496 (m,_) -> encodeFloat m (negate (floatDigits x))
498 scaleFloat k x = case decodeFloat x of
499 (m,n) -> encodeFloat m (n+k)
501 (0::Int) /= unsafePerformIO (_ccall_ isFloatNaN x) {- a _pure_function! -}
503 (0::Int) /= unsafePerformIO (_ccall_ isFloatInfinite x) {- ditto! -}
505 (0::Int) /= unsafePerformIO (_ccall_ isFloatDenormalized x) -- ..
507 (0::Int) /= unsafePerformIO (_ccall_ isFloatNegativeZero x) -- ...
510 instance Show Float where
511 showsPrec x = showSigned showFloat x
512 showList = showList__ (showsPrec 0)
515 %*********************************************************
517 \subsection{Type @Double@}
519 %*********************************************************
522 instance Eq Double where
523 (D# x) == (D# y) = x ==## y
525 instance Ord Double where
526 (D# x) `compare` (D# y) | x <## y = LT
530 (D# x) < (D# y) = x <## y
531 (D# x) <= (D# y) = x <=## y
532 (D# x) >= (D# y) = x >=## y
533 (D# x) > (D# y) = x >## y
535 instance Num Double where
536 (+) x y = plusDouble x y
537 (-) x y = minusDouble x y
538 negate x = negateDouble x
539 (*) x y = timesDouble x y
541 | otherwise = negateDouble x
542 signum x | x == 0.0 = 0
544 | otherwise = negate 1
545 fromInteger n = encodeFloat n 0
546 fromInt (I# n#) = case (int2Double# n#) of { d# -> D# d# }
548 instance Real Double where
549 toRational x = (m%1)*(b%1)^^n
550 where (m,n) = decodeFloat x
553 instance Fractional Double where
554 (/) x y = divideDouble x y
555 fromRational x = fromRat x
558 instance Floating Double where
559 pi = 3.141592653589793238
562 sqrt x = sqrtDouble x
566 asin x = asinDouble x
567 acos x = acosDouble x
568 atan x = atanDouble x
569 sinh x = sinhDouble x
570 cosh x = coshDouble x
571 tanh x = tanhDouble x
572 (**) x y = powerDouble x y
573 logBase x y = log y / log x
575 asinh x = log (x + sqrt (1.0+x*x))
576 acosh x = log (x + (x+1.0) * sqrt ((x-1.0)/(x+1.0)))
577 atanh x = log ((x+1.0) / sqrt (1.0-x*x))
579 instance RealFrac Double where
581 {-# SPECIALIZE properFraction :: Double -> (Int, Double) #-}
582 {-# SPECIALIZE truncate :: Double -> Int #-}
583 {-# SPECIALIZE round :: Double -> Int #-}
584 {-# SPECIALIZE ceiling :: Double -> Int #-}
585 {-# SPECIALIZE floor :: Double -> Int #-}
587 {-# SPECIALIZE properFraction :: Double -> (Integer, Double) #-}
588 {-# SPECIALIZE truncate :: Double -> Integer #-}
589 {-# SPECIALIZE round :: Double -> Integer #-}
590 {-# SPECIALIZE ceiling :: Double -> Integer #-}
591 {-# SPECIALIZE floor :: Double -> Integer #-}
593 #if defined(__UNBOXED_INSTANCES__)
594 {-# SPECIALIZE properFraction :: Double -> (Int#, Double) #-}
595 {-# SPECIALIZE truncate :: Double -> Int# #-}
596 {-# SPECIALIZE round :: Double -> Int# #-}
597 {-# SPECIALIZE ceiling :: Double -> Int# #-}
598 {-# SPECIALIZE floor :: Double -> Int# #-}
602 = case (decodeFloat x) of { (m,n) ->
603 let b = floatRadix x in
605 (fromInteger m * fromInteger b ^ n, 0.0)
607 case (quotRem m (b^(negate n))) of { (w,r) ->
608 (fromInteger w, encodeFloat r n)
612 truncate x = case properFraction x of
615 round x = case properFraction x of
617 m = if r < 0.0 then n - 1 else n + 1
618 half_down = abs r - 0.5
620 case (compare half_down 0.0) of
622 EQ -> if even n then n else m
625 ceiling x = case properFraction x of
626 (n,r) -> if r > 0.0 then n + 1 else n
628 floor x = case properFraction x of
629 (n,r) -> if r < 0.0 then n - 1 else n
631 instance RealFloat Double where
632 floatRadix _ = FLT_RADIX -- from float.h
633 floatDigits _ = DBL_MANT_DIG -- ditto
634 floatRange _ = (DBL_MIN_EXP, DBL_MAX_EXP) -- ditto
637 = case decodeDouble# d# of
638 ReturnIntAndGMP exp# a# s# d# ->
639 (J# a# s# d#, I# exp#)
641 encodeFloat (J# a# s# d#) (I# e#)
642 = case encodeDouble# a# s# d# e# of { dbl# -> D# dbl# }
644 exponent x = case decodeFloat x of
645 (m,n) -> if m == 0 then 0 else n + floatDigits x
647 significand x = case decodeFloat x of
648 (m,_) -> encodeFloat m (negate (floatDigits x))
650 scaleFloat k x = case decodeFloat x of
651 (m,n) -> encodeFloat m (n+k)
653 (0::Int) /= unsafePerformIO (_ccall_ isDoubleNaN x) {- a _pure_function! -}
655 (0::Int) /= unsafePerformIO (_ccall_ isDoubleInfinite x) {- ditto -}
657 (0::Int) /= unsafePerformIO (_ccall_ isDoubleDenormalized x) -- ..
659 (0::Int) /= unsafePerformIO (_ccall_ isDoubleNegativeZero x) -- ...
662 instance Show Double where
663 showsPrec x = showSigned showFloat x
664 showList = showList__ (showsPrec 0)
668 %*********************************************************
670 \subsection{Common code for @Float@ and @Double@}
672 %*********************************************************
674 The @Enum@ instances for Floats and Doubles are slightly unusual.
675 The @toEnum@ function truncates numbers to Int. The definitions
676 of @enumFrom@ and @enumFromThen@ allow floats to be used in arithmetic
677 series: [0,0.1 .. 1.0]. However, roundoff errors make these somewhat
678 dubious. This example may have either 10 or 11 elements, depending on
679 how 0.1 is represented.
681 NOTE: The instances for Float and Double do not make use of the default
682 methods for @enumFromTo@ and @enumFromThenTo@, as these rely on there being
683 a `non-lossy' conversion to and from Ints. Instead we make use of the
684 1.2 default methods (back in the days when Enum had Ord as a superclass)
685 for these (@numericEnumFromTo@ and @numericEnumFromThenTo@ below.)
688 instance Enum Float where
689 toEnum = fromIntegral
690 fromEnum = fromInteger . truncate -- may overflow
691 enumFrom = numericEnumFrom
692 enumFromThen = numericEnumFromThen
693 enumFromThenTo = numericEnumFromThenTo
695 instance Enum Double where
696 toEnum = fromIntegral
697 fromEnum = fromInteger . truncate -- may overflow
698 enumFrom = numericEnumFrom
699 enumFromThen = numericEnumFromThen
700 enumFromThenTo = numericEnumFromThenTo
702 numericEnumFrom :: (Real a) => a -> [a]
703 numericEnumFromThen :: (Real a) => a -> a -> [a]
704 numericEnumFromThenTo :: (Real a) => a -> a -> a -> [a]
705 numericEnumFrom = iterate (+1)
706 numericEnumFromThen n m = iterate (+(m-n)) n
707 numericEnumFromThenTo n m p = takeWhile (if m >= n then (<= p) else (>= p))
708 (numericEnumFromThen n m)
712 %*********************************************************
714 \subsection{The @Ratio@ and @Rational@ types}
716 %*********************************************************
719 data (Eval a, Integral a) => Ratio a = !a :% !a deriving (Eq)
720 type Rational = Ratio Integer
724 (%) :: (Integral a) => a -> a -> Ratio a
725 numerator, denominator :: (Integral a) => Ratio a -> a
726 approxRational :: (RealFrac a) => a -> a -> Rational
730 \tr{reduce} is a subsidiary function used only in this module .
731 It normalises a ratio by dividing both numerator and denominator by
732 their greatest common divisor.
735 reduce x 0 = error "{Ratio.%}: zero denominator"
736 reduce x y = (x `quot` d) :% (y `quot` d)
741 x % y = reduce (x * signum y) (abs y)
745 denominator (x:%y) = y
749 @approxRational@, applied to two real fractional numbers x and epsilon,
750 returns the simplest rational number within epsilon of x. A rational
751 number n%d in reduced form is said to be simpler than another n'%d' if
752 abs n <= abs n' && d <= d'. Any real interval contains a unique
753 simplest rational; here, for simplicity, we assume a closed rational
754 interval. If such an interval includes at least one whole number, then
755 the simplest rational is the absolutely least whole number. Otherwise,
756 the bounds are of the form q%1 + r%d and q%1 + r'%d', where abs r < d
757 and abs r' < d', and the simplest rational is q%1 + the reciprocal of
758 the simplest rational between d'%r' and d%r.
761 approxRational x eps = simplest (x-eps) (x+eps)
762 where simplest x y | y < x = simplest y x
764 | x > 0 = simplest' n d n' d'
765 | y < 0 = - simplest' (-n') d' (-n) d
767 where xr = toRational x
774 simplest' n d n' d' -- assumes 0 < n%d < n'%d'
776 | q /= q' = (q+1) :% 1
777 | otherwise = (q*n''+d'') :% n''
778 where (q,r) = quotRem n d
779 (q',r') = quotRem n' d'
780 nd'' = simplest' d' r' d r
782 d'' = denominator nd''
787 instance (Integral a) => Ord (Ratio a) where
788 (x:%y) <= (x':%y') = x * y' <= x' * y
789 (x:%y) < (x':%y') = x * y' < x' * y
791 instance (Integral a) => Num (Ratio a) where
792 (x:%y) + (x':%y') = reduce (x*y' + x'*y) (y*y')
793 (x:%y) - (x':%y') = reduce (x*y' - x'*y) (y*y')
794 (x:%y) * (x':%y') = reduce (x * x') (y * y')
795 negate (x:%y) = (-x) :% y
796 abs (x:%y) = abs x :% y
797 signum (x:%y) = signum x :% 1
798 fromInteger x = fromInteger x :% 1
800 instance (Integral a) => Real (Ratio a) where
801 toRational (x:%y) = toInteger x :% toInteger y
803 instance (Integral a) => Fractional (Ratio a) where
804 (x:%y) / (x':%y') = (x*y') % (y*x')
805 recip (x:%y) = if x < 0 then (-y) :% (-x) else y :% x
806 fromRational (x:%y) = fromInteger x :% fromInteger y
808 instance (Integral a) => RealFrac (Ratio a) where
809 properFraction (x:%y) = (fromIntegral q, r:%y)
810 where (q,r) = quotRem x y
812 instance (Integral a) => Enum (Ratio a) where
813 enumFrom = iterate ((+)1)
814 enumFromThen n m = iterate ((+)(m-n)) n
815 toEnum n = fromIntegral n :% 1
816 fromEnum = fromInteger . truncate
821 instance (Integral a) => Show (Ratio a) where
822 showsPrec p (x:%y) = showParen (p > ratio_prec)
823 (shows x . showString " % " . shows y)
827 --Exported from std library Numeric, defined here to
828 --avoid mut. rec. between PrelNum and Numeric.
829 showSigned :: (Real a) => (a -> ShowS) -> Int -> a -> ShowS
830 showSigned showPos p x = if x < 0 then showParen (p > 6)
831 (showChar '-' . showPos (-x))
834 showSignedInteger :: Int -> Integer -> ShowS
835 showSignedInteger p n r
836 = -- from HBC version; support code follows
837 if n < 0 && p > 6 then '(':jtos n++(')':r) else jtos n ++ r
839 jtos :: Integer -> String
846 jtos' :: Integer -> String -> String
849 chr (fromInteger (n + ord_0)) : cs
851 jtos' (n `quot` 10) (chr (toInt (n `rem` 10) + (ord_0::Int)) : cs)
853 showFloat x = showString (formatRealFloat FFGeneric Nothing x)
855 -- These are the format types. This type is not exported.
857 data FFFormat = FFExponent | FFFixed | FFGeneric --no need: deriving (Eq, Ord, Show)
859 formatRealFloat :: (RealFloat a) => FFFormat -> Maybe Int -> a -> String
860 formatRealFloat fmt decs x = s
867 if x < 0 then "-Infinity" else "Infinity"
869 if x < 0 || isNegativeZero x then
870 '-':doFmt fmt (floatToDigits (toInteger base) (-x))
872 doFmt fmt (floatToDigits (toInteger base) x)
875 let ds = map intToDigit is in
878 doFmt (if e <0 || e > 7 then FFExponent else FFFixed)
883 let e' = if e==0 then 0 else e-1 in
886 (d:ds) -> d : '.' : ds ++ "e") ++ show e'
888 let dec' = max dec 1 in
890 [0] -> '0':'.':take dec' (repeat '0') ++ "e0"
893 (ei,is') = roundTo base (dec'+1) is
894 d:ds = map intToDigit (if ei > 0 then init is' else is')
896 d:'.':ds ++ 'e':show (e-1+ei)
899 mk0 ls = case ls of { "" -> "0" ; _ -> ls}
904 f 0 s ds = mk0 (reverse s) ++ '.':mk0 ds
905 f n s "" = f (n-1) ('0':s) ""
906 f n s (d:ds) = f (n-1) (d:s) ds
910 let dec' = max dec 1 in
913 (ei,is') = roundTo base (dec' + e) is
914 (ls,rs) = splitAt (e+ei) (map intToDigit is')
916 mk0 ls ++ (if null rs then "" else '.':rs)
919 (ei,is') = roundTo base dec' (replicate (-e) 0 ++ is)
920 d:ds = map intToDigit (if ei > 0 then is' else 0:is')
925 roundTo :: Int -> Int -> [Int] -> (Int,[Int])
936 f n [] = (0, replicate n 0)
937 f 0 (i:_) = (if i>=b2 then 1 else 0, [])
943 if i' == base then (1,0:ds) else (0,i':ds)
946 -- Based on "Printing Floating-Point Numbers Quickly and Accurately"
947 -- by R.G. Burger and R.K. Dybvig in PLDI 96.
948 -- This version uses a much slower logarithm estimator. It should be improved.
950 -- This function returns a list of digits (Ints in [0..base-1]) and an
952 --floatToDigits :: (RealFloat a) => Integer -> a -> ([Int], Int)
953 floatToDigits _ 0 = ([0], 0)
954 floatToDigits base x =
956 (f0, e0) = decodeFloat x
957 (minExp0, _) = floatRange x
960 minExp = minExp0 - p -- the real minimum exponent
961 -- Haskell requires that f be adjusted so denormalized numbers
962 -- will have an impossibly low exponent. Adjust for this.
964 let n = minExp - e0 in
965 if n > 0 then (f0 `div` (b^n), e0+n) else (f0, e0)
970 (f*be*b*2, 2*b, be*b, b)
974 if e > minExp && f == b^(p-1) then
975 (f*b*2, b^(-e+1)*2, b, 1)
977 (f*2, b^(-e)*2, 1, 1)
981 if b == 2 && base == 10 then
982 -- logBase 10 2 is slightly bigger than 3/10 so
983 -- the following will err on the low side. Ignoring
984 -- the fraction will make it err even more.
985 -- Haskell promises that p-1 <= logBase b f < p.
986 (p - 1 + e0) * 3 `div` 10
988 ceiling ((log (fromInteger (f+1)) +
989 fromInt e * log (fromInteger b)) /
990 fromInt e * log (fromInteger b))
994 if r + mUp <= expt base n * s then n else fixup (n+1)
996 if expt base (-n) * (r + mUp) <= s then n else fixup (n+1)
1000 gen ds rn sN mUpN mDnN =
1002 (dn, rn') = (rn * base) `divMod` sN
1006 case (rn' < mDnN', rn' + mUpN' > sN) of
1007 (True, False) -> dn : ds
1008 (False, True) -> dn+1 : ds
1009 (True, True) -> if rn' * 2 < sN then dn : ds else dn+1 : ds
1010 (False, False) -> gen (dn:ds) rn' sN mUpN' mDnN'
1014 gen [] r (s * expt base k) mUp mDn
1016 let bk = expt base (-k) in
1017 gen [] (r * bk) s (mUp * bk) (mDn * bk)
1019 (map toInt (reverse rds), k)
1023 @showRational@ converts a Rational to a string that looks like a
1024 floating point number, but without converting to any floating type
1025 (because of the possible overflow).
1027 From/by Lennart, 94/09/26
1030 showRational :: Int -> Rational -> String
1035 let (r', e) = normalize r
1038 startExpExp = 4 :: Int
1040 -- make sure 1 <= r < 10
1041 normalize :: Rational -> (Rational, Int)
1042 normalize r = if r < 1 then
1043 case norm startExpExp (1 / r) 0 of (r', e) -> (10 / r', -e-1)
1045 norm startExpExp r 0
1046 where norm :: Int -> Rational -> Int -> (Rational, Int)
1047 -- Invariant: r*10^e == original r
1052 in if r >= tn then norm ee (r/tn) (e+n) else norm (ee-1) r e
1055 drop0 (c:cs) = c : reverse (dropWhile (=='0') (reverse cs))
1057 prR :: Int -> Rational -> Int -> String
1058 prR n r e | r < 1 = prR n (r*10) (e-1) -- final adjustment
1059 prR n r e | r >= 10 = prR n (r/10) (e+1)
1061 let s = show ((round (r * 10^n))::Integer)
1063 in if e > 0 && e < 8 then
1064 take e s ++ "." ++ drop0 (drop e s)
1065 else if e <= 0 && e > -3 then
1066 "0." ++ take (-e) (repeat '0') ++ drop0 s
1068 head s : "."++ drop0 (tail s) ++ "e" ++ show e0
1072 [In response to a request for documentation of how fromRational works,
1073 Joe Fasel writes:] A quite reasonable request! This code was added to
1074 the Prelude just before the 1.2 release, when Lennart, working with an
1075 early version of hbi, noticed that (read . show) was not the identity
1076 for floating-point numbers. (There was a one-bit error about half the
1077 time.) The original version of the conversion function was in fact
1078 simply a floating-point divide, as you suggest above. The new version
1079 is, I grant you, somewhat denser.
1081 Unfortunately, Joe's code doesn't work! Here's an example:
1083 main = putStr (shows (1.82173691287639817263897126389712638972163e-300::Double) "\n")
1088 1.8217369128763981e-300
1090 Lennart's code follows, and it works...
1093 {-# GENERATE_SPECS fromRational__ a{Double#,Double} #-}
1094 fromRat :: (RealFloat a) => Rational -> a
1098 -- If the exponent of the nearest floating-point number to x
1099 -- is e, then the significand is the integer nearest xb^(-e),
1100 -- where b is the floating-point radix. We start with a good
1101 -- guess for e, and if it is correct, the exponent of the
1102 -- floating-point number we construct will again be e. If
1103 -- not, one more iteration is needed.
1105 f e = if e' == e then y else f e'
1106 where y = encodeFloat (round (x * (1 % b)^^e)) e
1107 (_,e') = decodeFloat y
1110 -- We obtain a trial exponent by doing a floating-point
1111 -- division of x's numerator by its denominator. The
1112 -- result of this division may not itself be the ultimate
1113 -- result, because of an accumulation of three rounding
1116 (s,e) = decodeFloat (fromInteger (numerator x) `asTypeOf` x'
1117 / fromInteger (denominator x))
1120 Now, here's Lennart's code.
1123 --fromRat :: (RealFloat a) => Rational -> a
1125 if x == 0 then encodeFloat 0 0 -- Handle exceptional cases
1126 else if x < 0 then - fromRat' (-x) -- first.
1129 -- Conversion process:
1130 -- Scale the rational number by the RealFloat base until
1131 -- it lies in the range of the mantissa (as used by decodeFloat/encodeFloat).
1132 -- Then round the rational to an Integer and encode it with the exponent
1133 -- that we got from the scaling.
1134 -- To speed up the scaling process we compute the log2 of the number to get
1135 -- a first guess of the exponent.
1137 fromRat' :: (RealFloat a) => Rational -> a
1139 where b = floatRadix r
1141 (minExp0, _) = floatRange r
1142 minExp = minExp0 - p -- the real minimum exponent
1143 xMin = toRational (expt b (p-1))
1144 xMax = toRational (expt b p)
1145 p0 = (integerLogBase b (numerator x) - integerLogBase b (denominator x) - p) `max` minExp
1146 f = if p0 < 0 then 1 % expt b (-p0) else expt b p0 % 1
1147 (x', p') = scaleRat (toRational b) minExp xMin xMax p0 (x / f)
1148 r = encodeFloat (round x') p'
1150 -- Scale x until xMin <= x < xMax, or p (the exponent) <= minExp.
1151 scaleRat :: Rational -> Int -> Rational -> Rational -> Int -> Rational -> (Rational, Int)
1152 scaleRat b minExp xMin xMax p x =
1155 else if x >= xMax then
1156 scaleRat b minExp xMin xMax (p+1) (x/b)
1157 else if x < xMin then
1158 scaleRat b minExp xMin xMax (p-1) (x*b)
1162 -- Exponentiation with a cache for the most common numbers.
1165 expt :: Integer -> Int -> Integer
1167 if base == 2 && n >= minExpt && n <= maxExpt then
1171 expts :: Array Int Integer
1172 expts = array (minExpt,maxExpt) [(n,2^n) | n <- [minExpt .. maxExpt]]
1174 -- Compute the (floor of the) log of i in base b.
1175 -- Simplest way would be just divide i by b until it's smaller then b, but that would
1176 -- be very slow! We are just slightly more clever.
1177 integerLogBase :: Integer -> Integer -> Int
1178 integerLogBase b i =
1182 -- Try squaring the base first to cut down the number of divisions.
1183 let l = 2 * integerLogBase (b*b) i
1184 doDiv :: Integer -> Int -> Int
1185 doDiv i l = if i < b then l else doDiv (i `div` b) (l+1)
1186 in doDiv (i `div` (b^l)) l
1189 %*********************************************************
1191 \subsection{Numeric primops}
1193 %*********************************************************
1195 Definitions of the boxed PrimOps; these will be
1196 used in the case of partial applications, etc.
1199 plusFloat (F# x) (F# y) = F# (plusFloat# x y)
1200 minusFloat (F# x) (F# y) = F# (minusFloat# x y)
1201 timesFloat (F# x) (F# y) = F# (timesFloat# x y)
1202 divideFloat (F# x) (F# y) = F# (divideFloat# x y)
1203 negateFloat (F# x) = F# (negateFloat# x)
1205 gtFloat (F# x) (F# y) = gtFloat# x y
1206 geFloat (F# x) (F# y) = geFloat# x y
1207 eqFloat (F# x) (F# y) = eqFloat# x y
1208 neFloat (F# x) (F# y) = neFloat# x y
1209 ltFloat (F# x) (F# y) = ltFloat# x y
1210 leFloat (F# x) (F# y) = leFloat# x y
1212 float2Int (F# x) = I# (float2Int# x)
1213 int2Float (I# x) = F# (int2Float# x)
1215 expFloat (F# x) = F# (expFloat# x)
1216 logFloat (F# x) = F# (logFloat# x)
1217 sqrtFloat (F# x) = F# (sqrtFloat# x)
1218 sinFloat (F# x) = F# (sinFloat# x)
1219 cosFloat (F# x) = F# (cosFloat# x)
1220 tanFloat (F# x) = F# (tanFloat# x)
1221 asinFloat (F# x) = F# (asinFloat# x)
1222 acosFloat (F# x) = F# (acosFloat# x)
1223 atanFloat (F# x) = F# (atanFloat# x)
1224 sinhFloat (F# x) = F# (sinhFloat# x)
1225 coshFloat (F# x) = F# (coshFloat# x)
1226 tanhFloat (F# x) = F# (tanhFloat# x)
1228 powerFloat (F# x) (F# y) = F# (powerFloat# x y)
1230 -- definitions of the boxed PrimOps; these will be
1231 -- used in the case of partial applications, etc.
1233 plusDouble (D# x) (D# y) = D# (x +## y)
1234 minusDouble (D# x) (D# y) = D# (x -## y)
1235 timesDouble (D# x) (D# y) = D# (x *## y)
1236 divideDouble (D# x) (D# y) = D# (x /## y)
1237 negateDouble (D# x) = D# (negateDouble# x)
1239 gtDouble (D# x) (D# y) = x >## y
1240 geDouble (D# x) (D# y) = x >=## y
1241 eqDouble (D# x) (D# y) = x ==## y
1242 neDouble (D# x) (D# y) = x /=## y
1243 ltDouble (D# x) (D# y) = x <## y
1244 leDouble (D# x) (D# y) = x <=## y
1246 double2Int (D# x) = I# (double2Int# x)
1247 int2Double (I# x) = D# (int2Double# x)
1248 double2Float (D# x) = F# (double2Float# x)
1249 float2Double (F# x) = D# (float2Double# x)
1251 expDouble (D# x) = D# (expDouble# x)
1252 logDouble (D# x) = D# (logDouble# x)
1253 sqrtDouble (D# x) = D# (sqrtDouble# x)
1254 sinDouble (D# x) = D# (sinDouble# x)
1255 cosDouble (D# x) = D# (cosDouble# x)
1256 tanDouble (D# x) = D# (tanDouble# x)
1257 asinDouble (D# x) = D# (asinDouble# x)
1258 acosDouble (D# x) = D# (acosDouble# x)
1259 atanDouble (D# x) = D# (atanDouble# x)
1260 sinhDouble (D# x) = D# (sinhDouble# x)
1261 coshDouble (D# x) = D# (coshDouble# x)
1262 tanhDouble (D# x) = D# (tanhDouble# x)
1264 powerDouble (D# x) (D# y) = D# (x **## y)