{-| Module : Data.Number.ER.Real.Approx.Elementary Description : abstraction of exact reals capable of elementary operations Copyright : (c) Michal Konecny License : BSD3 Maintainer : mik@konecny.aow.cz Stability : experimental Portability : portable To be imported qualified, usually with the synonym RAEL. -} module Data.Number.ER.Real.Approx.Elementary ( ERApproxElementary(..) ) where import Prelude hiding (exp, log, sin, cos) import qualified Data.Number.ER.Real.Approx as RA import Data.Number.ER.BasicTypes import Data.Number.ER.Real.Arithmetic.Elementary {-| A class defining various common real number operations in a approximation-aware fashion, ie introducing effort indices. All operations here have default implementations based on "Data.Number.ER.Real.Arithmetic.Elementary". -} class (RA.ERIntApprox ra, Ord ra) => (ERApproxElementary ra) where abs :: EffortIndex -> ra -> ra abs ix = Prelude.abs min :: EffortIndex -> ra -> ra -> ra min ix = Prelude.min max :: EffortIndex -> ra -> ra -> ra max ix = Prelude.max exp :: EffortIndex -> ra -> ra exp = erExp_IR log :: EffortIndex -> ra -> ra log = erLog_IR (**) :: EffortIndex -> ra -> ra -> ra (**) ix b e = exp ix $ e * (log ix b) pi :: EffortIndex -> ra pi = erPi_R sin :: EffortIndex -> ra -> ra sin = erSine_IR cos :: EffortIndex -> ra -> ra cos = erCosine_IR tan :: EffortIndex -> ra -> ra tan ix r = (sin ix r) / (cos ix r) atan :: EffortIndex -> ra -> ra atan = erATan_IR