{-# 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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Num a => Integer -> a
P.fromInteger -- default precision (mBound)!
    negate :: MPFloat -> MPFloat
negate = (Approx -> Approx) -> MPFloat -> MPFloat
lift1 forall a. Num a => a -> a
P.negate
    abs :: MPFloat -> MPFloat
abs = (Approx -> Approx) -> MPFloat -> MPFloat
lift1 forall a. Num a => a -> a
P.abs
    signum :: MPFloat -> MPFloat
signum = (Approx -> Approx) -> MPFloat -> MPFloat
lift1 forall a. Num a => a -> a
P.signum
    + :: MPFloat -> MPFloat -> MPFloat
(+) = forall t1 t2.
(t1 -> t2 -> BoundsCEDU MPFloat) -> t1 -> t2 -> MPFloat
c2 MPFloat -> MPFloat -> BoundsCEDU MPFloat
addCEDU
    (-) = forall t1 t2.
(t1 -> t2 -> BoundsCEDU MPFloat) -> t1 -> t2 -> MPFloat
c2 MPFloat -> MPFloat -> BoundsCEDU MPFloat
subCEDU
    * :: 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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Fractional a => Rational -> a
P.fromRational -- default precision (mBound)!
    / :: 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 = forall t. (t -> BoundsCEDU MPFloat) -> t -> MPFloat
c1 MPFloat -> BoundsCEDU MPFloat
sinCEDU
    cos :: MPFloat -> MPFloat
cos = forall t. (t -> BoundsCEDU MPFloat) -> t -> MPFloat
c1 MPFloat -> BoundsCEDU MPFloat
cosCEDU
    exp :: MPFloat -> MPFloat
exp = forall t. (t -> BoundsCEDU MPFloat) -> t -> MPFloat
c1 MPFloat -> BoundsCEDU MPFloat
expCEDU
    log :: MPFloat -> MPFloat
log = forall t. (t -> BoundsCEDU MPFloat) -> t -> MPFloat
c1 MPFloat -> BoundsCEDU MPFloat
logCEDU
    pi :: MPFloat
pi = forall a. HasCallStack => [Char] -> a
error [Char]
"Prelude.Floating MPFloat: pi not defined"
    asin :: MPFloat -> MPFloat
asin = forall a. HasCallStack => [Char] -> a
error [Char]
"Prelude.Floating MPFloat: asin not defined yet"
    acos :: MPFloat -> MPFloat
acos = forall a. HasCallStack => [Char] -> a
error [Char]
"Prelude.Floating MPFloat: acos not defined yet"
    atan :: MPFloat -> MPFloat
atan = forall a. HasCallStack => [Char] -> a
error [Char]
"Prelude.Floating MPFloat: atan not defined yet"
    sinh :: MPFloat -> MPFloat
sinh = forall a. HasCallStack => [Char] -> a
error [Char]
"Prelude.Floating MPFloat: sinh not defined yet"
    cosh :: MPFloat -> MPFloat
cosh = forall a. HasCallStack => [Char] -> a
error [Char]
"Prelude.Floating MPFloat: cosh not defined yet"
    asinh :: MPFloat -> MPFloat
asinh = forall a. HasCallStack => [Char] -> a
error [Char]
"Prelude.Floating MPFloat: asinh not defined yet"
    acosh :: MPFloat -> MPFloat
acosh = forall a. HasCallStack => [Char] -> a
error [Char]
"Prelude.Floating MPFloat: acosh not defined yet"
    atanh :: MPFloat -> MPFloat
atanh = forall a. HasCallStack => [Char] -> a
error [Char]
"Prelude.Floating MPFloat: atanh not defined yet"

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

c2 :: 
    (t1 -> t2 -> BoundsCEDU MPFloat) -> 
    (t1 -> t2 -> MPFloat)
c2 :: forall t1 t2.
(t1 -> t2 -> BoundsCEDU MPFloat) -> t1 -> t2 -> MPFloat
c2 t1 -> t2 -> BoundsCEDU MPFloat
op t1
x t2
y = forall a. BoundsCEDU a -> a
ceduCentre 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) = forall a. Real a => a -> Rational
toRational Approx
a