{-|
module      :  Data.Number.Flint.Arb.Mag
copyright   :  (c) 2022 Hartmut Monien
license     :  GNU GPL, version 2 or above (see LICENSE)
maintainer  :  hmonien@uni-bonn.de


The @mag_t@ type holds an unsigned floating-point number with a
fixed-precision mantissa (30 bits) and an arbitrary-precision exponent
(represented as an @fmpz_t@), suited for representing magnitude bounds.
The special values zero and positive infinity are supported, but not
NaN.

Operations that involve rounding will always produce a valid upper
bound, or a lower bound if the function name has the suffix /lower/. For
performance reasons, no attempt is made to compute the best possible
bounds: in general, a bound may be several ulps larger\/smaller than the
optimal bound. Some functions such as @mag_set@ and @mag_mul_2exp_si@
are always exact and therefore do not require separate /lower/ versions.
--
A common mistake is to forget computing a lower bound for the argument
of a decreasing function that is meant to be bounded from above, or vice
versa. For example, to compute an upper bound for \((x+1)/(y+1)\), the
parameter /x/ should initially be an upper bound while /y/ should be a
lower bound, and one should do:

For a lower bound of the same expression, /x/ should be a lower bound
while /y/ should be an upper bound, and one should do:

Applications requiring floating-point arithmetic with more flexibility
(such as correct rounding, or higher precision) should use the @arf_t@
type instead. For calculations where a complex alternation between upper
and lower bounds is necessary, it may be cleaner to use @arb_t@
arithmetic and convert to a @mag_t@ bound only in the end.
-}

module Data.Number.Flint.Arb.Mag (
  module Data.Number.Flint.Arb.Mag.FFI
  ) where

import Data.Number.Flint.Arb.Mag.FFI