{-#
LANGUAGE
BangPatterns,
MagicHash,
UnboxedTuples,
UnliftedNewtypes
#-}
module Numeric.Mantissa (
Mantissa(..),
oneMinusE,
mantissaFromWord,
mantissaToWord,
mantissaToFractional,
) where
import Data.Ratio ((%), numerator, denominator)
import GHC.Num (integerToWord, integerFromWord)
import GHC.Exts (Word(..), isTrue#, not#)
import Numeric.Mantissa.Unboxed
data Mantissa = M# Mantissa#
oneMinusE :: Mantissa
oneMinusE :: Mantissa
oneMinusE = Mantissa# -> Mantissa
M# (Word# -> Mantissa#
Mantissa# (Word# -> Word#
not# Word#
0##))
instance Num Mantissa where
M# Mantissa#
a + :: Mantissa -> Mantissa -> Mantissa
+ M# Mantissa#
b = Mantissa# -> Mantissa
M# (Mantissa# -> Mantissa# -> Mantissa#
plusMod1Mantissa# Mantissa#
a Mantissa#
b)
M# Mantissa#
a - :: Mantissa -> Mantissa -> Mantissa
- M# Mantissa#
b = Mantissa# -> Mantissa
M# (Mantissa# -> Mantissa# -> Mantissa#
minusMod1Mantissa# Mantissa#
a Mantissa#
b)
M# Mantissa#
a * :: Mantissa -> Mantissa -> Mantissa
* M# Mantissa#
b = Mantissa# -> Mantissa
M# (Mantissa# -> Mantissa# -> Mantissa#
timesMantissa# Mantissa#
a Mantissa#
b)
abs :: Mantissa -> Mantissa
abs = Mantissa -> Mantissa
forall a. a -> a
id
fromInteger :: Integer -> Mantissa
fromInteger Integer
0 = Mantissa# -> Mantissa
M# (Word# -> Mantissa#
Mantissa# Word#
0##)
fromInteger Integer
_ = [Char] -> Mantissa
forall a. HasCallStack => [Char] -> a
error [Char]
"fromInteger: can only convert 0 to mantissa"
signum :: Mantissa -> Mantissa
signum Mantissa
0 = Mantissa
0
signum Mantissa
_ = Mantissa
oneMinusE
instance Eq Mantissa where
M# Mantissa#
a == :: Mantissa -> Mantissa -> Bool
== M# Mantissa#
b = Int# -> Bool
isTrue# (Mantissa# -> Mantissa# -> Int#
eqMantissa# Mantissa#
a Mantissa#
b)
instance Ord Mantissa where
M# Mantissa#
a < :: Mantissa -> Mantissa -> Bool
< M# Mantissa#
b = Int# -> Bool
isTrue# (Mantissa# -> Mantissa# -> Int#
ltMantissa# Mantissa#
a Mantissa#
b)
M# Mantissa#
a > :: Mantissa -> Mantissa -> Bool
> M# Mantissa#
b = Int# -> Bool
isTrue# (Mantissa# -> Mantissa# -> Int#
gtMantissa# Mantissa#
a Mantissa#
b)
M# Mantissa#
a <= :: Mantissa -> Mantissa -> Bool
<= M# Mantissa#
b = Int# -> Bool
isTrue# (Mantissa# -> Mantissa# -> Int#
leMantissa# Mantissa#
a Mantissa#
b)
M# Mantissa#
a >= :: Mantissa -> Mantissa -> Bool
>= M# Mantissa#
b = Int# -> Bool
isTrue# (Mantissa# -> Mantissa# -> Int#
geMantissa# Mantissa#
a Mantissa#
b)
mantissaFromWord :: Word -> Mantissa
mantissaFromWord :: Word -> Mantissa
mantissaFromWord (W# Word#
w) = Mantissa# -> Mantissa
M# (Word# -> Mantissa#
Mantissa# Word#
w)
mantissaToWord :: Mantissa -> Word
mantissaToWord :: Mantissa -> Word
mantissaToWord (M# (Mantissa# Word#
w)) = Word# -> Word
W# Word#
w
mantissaSerial :: Mantissa -> Integer
mantissaSerial :: Mantissa -> Integer
mantissaSerial = Word -> Integer
integerFromWord (Word -> Integer) -> (Mantissa -> Word) -> Mantissa -> Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Mantissa -> Word
mantissaToWord
wordMultiple :: Integer
wordMultiple :: Integer
wordMultiple = Integer
1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Mantissa -> Integer
mantissaSerial Mantissa
oneMinusE
instance Fractional Mantissa where
M# Mantissa#
a / :: Mantissa -> Mantissa -> Mantissa
/ M# Mantissa#
b = Mantissa# -> Mantissa
M# (Mantissa# -> Mantissa# -> Mantissa#
quotMantissa# Mantissa#
a Mantissa#
b)
recip :: Mantissa -> Mantissa
recip Mantissa
_ = [Char] -> Mantissa
forall a. HasCallStack => [Char] -> a
error [Char]
"recip: cannot take reciprocal of a mantissa"
fromRational :: Rational -> Mantissa
fromRational Rational
u = let
q :: Integer
q = Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
quot (Integer
wordMultiple Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Rational -> Integer
forall a. Ratio a -> a
numerator Rational
u) (Rational -> Integer
forall a. Ratio a -> a
denominator Rational
u)
in Word -> Mantissa
mantissaFromWord (Integer -> Word
integerToWord Integer
q)
mantissaToFractional :: Fractional a => Mantissa -> a
mantissaToFractional :: forall a. Fractional a => Mantissa -> a
mantissaToFractional Mantissa
m = Rational -> a
forall a. Fractional a => Rational -> a
fromRational (Mantissa -> Integer
mantissaSerial Mantissa
m Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
% Integer
wordMultiple)