packages feed

aern2-mp-0.1.3.0: src/AERN2/MP/Float/Constants.hs

{-# LANGUAGE CPP #-}
{-|
    Module      :  AERN2.MP.Float.Constants
    Description :  Special constants NaN, infinity etc
    Copyright   :  (c) Michal Konecny
    License     :  BSD3

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

    Special constants NaN, infinity etc
-}

module AERN2.MP.Float.Constants
  (
    zero, one
    , nan, infinity
  )
where

import MixedTypesNumPrelude
import qualified Prelude as P
-- import Data.Ratio

#ifdef UseCDAR
import AERN2.MP.Float.UseCDAR.Type
import AERN2.MP.Float.UseCDAR.Conversions
#else
import AERN2.MP.Float.UseRounded.Type
import AERN2.MP.Float.UseRounded.Conversions
#endif

import AERN2.MP.Float.Operators

zero, one :: MPFloat
zero = mpFloat 0
one = mpFloat 1

nan, infinity :: MPFloat
nan = zero /. zero
infinity = one /. zero

itisNaN :: MPFloat -> Bool
itisNaN x = x *^ one /= x

itisInfinite :: MPFloat -> Bool
itisInfinite x =
  x *^ (mpFloat 2) P.== x
  &&
  x P./= (mpFloat 0)

instance CanTestFinite MPFloat where
  isInfinite = itisInfinite
  isFinite x = not (itisInfinite x || itisNaN x)

instance CanTestNaN MPFloat where
  isNaN = itisNaN