{-# LANGUAGE StandaloneDeriving #-}
{-# OPTIONS_GHC -Wno-orphans #-}
{-|
    Module      :  AERN2.MP.Float.PreludeNum
    Description :  Prelude numerical operators for MPFloat
    Copyright   :  (c) Michal Konecny
    License     :  BSD3

    Maintainer  :  mikkonecny@gmail.com
    Stability   :  experimental
    Portability :  portable

    Instances for Prelude classes such as Num, Fractional, using an unspecified rounding.
-}

module AERN2.MP.Float.PreludeNum
(
)
where

import MixedTypesNumPrelude
import qualified Prelude as P

-- import AERN2.MP.Precision
import AERN2.MP.Float.Auxi

import AERN2.MP.Float.Type
import AERN2.MP.Float.Arithmetic

deriving instance P.Eq MPFloat
deriving instance P.Ord MPFloat

instance P.Num MPFloat where
    fromInteger :: Integer -> MPFloat
fromInteger = Approx -> MPFloat
MPFloat (Approx -> MPFloat) -> (Integer -> Approx) -> Integer -> MPFloat
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Approx
forall a. Num a => Integer -> a
P.fromInteger -- default precision (mBound)!
    negate :: MPFloat -> MPFloat
negate = (Approx -> Approx) -> MPFloat -> MPFloat
lift1 Approx -> Approx
forall a. Num a => a -> a
P.negate
    abs :: MPFloat -> MPFloat
abs = (Approx -> Approx) -> MPFloat -> MPFloat
lift1 Approx -> Approx
forall a. Num a => a -> a
P.abs
    signum :: MPFloat -> MPFloat
signum = (Approx -> Approx) -> MPFloat -> MPFloat
lift1 Approx -> Approx
forall a. Num a => a -> a
P.signum
    + :: MPFloat -> MPFloat -> MPFloat
(+) = (MPFloat -> MPFloat -> BoundsCEDU MPFloat)
-> MPFloat -> MPFloat -> MPFloat
forall t1 t2.
(t1 -> t2 -> BoundsCEDU MPFloat) -> t1 -> t2 -> MPFloat
c2 MPFloat -> MPFloat -> BoundsCEDU MPFloat
addCEDU
    (-) = (MPFloat -> MPFloat -> BoundsCEDU MPFloat)
-> MPFloat -> MPFloat -> MPFloat
forall t1 t2.
(t1 -> t2 -> BoundsCEDU MPFloat) -> t1 -> t2 -> MPFloat
c2 MPFloat -> MPFloat -> BoundsCEDU MPFloat
subCEDU
    * :: MPFloat -> MPFloat -> MPFloat
(*) = (MPFloat -> MPFloat -> BoundsCEDU MPFloat)
-> MPFloat -> MPFloat -> MPFloat
forall t1 t2.
(t1 -> t2 -> BoundsCEDU MPFloat) -> t1 -> t2 -> MPFloat
c2 MPFloat -> MPFloat -> BoundsCEDU MPFloat
mulCEDU

instance P.Fractional MPFloat where
    fromRational :: Rational -> MPFloat
fromRational = Approx -> MPFloat
MPFloat (Approx -> MPFloat) -> (Rational -> Approx) -> Rational -> MPFloat
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> Approx
forall a. Fractional a => Rational -> a
P.fromRational -- default precision (mBound)!
    / :: MPFloat -> MPFloat -> MPFloat
(/) = (MPFloat -> MPFloat -> BoundsCEDU MPFloat)
-> MPFloat -> MPFloat -> MPFloat
forall t1 t2.
(t1 -> t2 -> BoundsCEDU MPFloat) -> t1 -> t2 -> MPFloat
c2 MPFloat -> MPFloat -> BoundsCEDU MPFloat
divCEDU

instance P.Floating MPFloat where
    sin :: MPFloat -> MPFloat
sin = (MPFloat -> BoundsCEDU MPFloat) -> MPFloat -> MPFloat
forall t. (t -> BoundsCEDU MPFloat) -> t -> MPFloat
c1 MPFloat -> BoundsCEDU MPFloat
sinCEDU
    cos :: MPFloat -> MPFloat
cos = (MPFloat -> BoundsCEDU MPFloat) -> MPFloat -> MPFloat
forall t. (t -> BoundsCEDU MPFloat) -> t -> MPFloat
c1 MPFloat -> BoundsCEDU MPFloat
cosCEDU
    exp :: MPFloat -> MPFloat
exp = (MPFloat -> BoundsCEDU MPFloat) -> MPFloat -> MPFloat
forall t. (t -> BoundsCEDU MPFloat) -> t -> MPFloat
c1 MPFloat -> BoundsCEDU MPFloat
expCEDU
    log :: MPFloat -> MPFloat
log = (MPFloat -> BoundsCEDU MPFloat) -> MPFloat -> MPFloat
forall t. (t -> BoundsCEDU MPFloat) -> t -> MPFloat
c1 MPFloat -> BoundsCEDU MPFloat
logCEDU
    pi :: MPFloat
pi = [Char] -> MPFloat
forall a. HasCallStack => [Char] -> a
error [Char]
"Prelude.Floating MPFloat: pi not defined"
    asin :: MPFloat -> MPFloat
asin = [Char] -> MPFloat -> MPFloat
forall a. HasCallStack => [Char] -> a
error [Char]
"Prelude.Floating MPFloat: asin not defined yet"
    acos :: MPFloat -> MPFloat
acos = [Char] -> MPFloat -> MPFloat
forall a. HasCallStack => [Char] -> a
error [Char]
"Prelude.Floating MPFloat: acos not defined yet"
    atan :: MPFloat -> MPFloat
atan = [Char] -> MPFloat -> MPFloat
forall a. HasCallStack => [Char] -> a
error [Char]
"Prelude.Floating MPFloat: atan not defined yet"
    sinh :: MPFloat -> MPFloat
sinh = [Char] -> MPFloat -> MPFloat
forall a. HasCallStack => [Char] -> a
error [Char]
"Prelude.Floating MPFloat: sinh not defined yet"
    cosh :: MPFloat -> MPFloat
cosh = [Char] -> MPFloat -> MPFloat
forall a. HasCallStack => [Char] -> a
error [Char]
"Prelude.Floating MPFloat: cosh not defined yet"
    asinh :: MPFloat -> MPFloat
asinh = [Char] -> MPFloat -> MPFloat
forall a. HasCallStack => [Char] -> a
error [Char]
"Prelude.Floating MPFloat: asinh not defined yet"
    acosh :: MPFloat -> MPFloat
acosh = [Char] -> MPFloat -> MPFloat
forall a. HasCallStack => [Char] -> a
error [Char]
"Prelude.Floating MPFloat: acosh not defined yet"
    atanh :: MPFloat -> MPFloat
atanh = [Char] -> MPFloat -> MPFloat
forall a. HasCallStack => [Char] -> a
error [Char]
"Prelude.Floating MPFloat: atanh not defined yet"

c1 :: 
    (t -> BoundsCEDU MPFloat) -> 
    (t -> MPFloat)
c1 :: (t -> BoundsCEDU MPFloat) -> t -> MPFloat
c1 t -> BoundsCEDU MPFloat
op t
x = BoundsCEDU MPFloat -> MPFloat
forall a. BoundsCEDU a -> a
ceduCentre (BoundsCEDU MPFloat -> MPFloat) -> BoundsCEDU MPFloat -> MPFloat
forall a b. (a -> b) -> a -> b
$ t -> BoundsCEDU MPFloat
op t
x

c2 :: 
    (t1 -> t2 -> BoundsCEDU MPFloat) -> 
    (t1 -> t2 -> MPFloat)
c2 :: (t1 -> t2 -> BoundsCEDU MPFloat) -> t1 -> t2 -> MPFloat
c2 t1 -> t2 -> BoundsCEDU MPFloat
op t1
x t2
y = BoundsCEDU MPFloat -> MPFloat
forall a. BoundsCEDU a -> a
ceduCentre (BoundsCEDU MPFloat -> MPFloat) -> BoundsCEDU MPFloat -> MPFloat
forall a b. (a -> b) -> a -> b
$ t1 -> t2 -> BoundsCEDU MPFloat
op t1
x t2
y

instance P.Real MPFloat where
    toRational :: MPFloat -> Rational
toRational (MPFloat Approx
a) = Approx -> Rational
forall a. Real a => a -> Rational
toRational Approx
a