DEFINITION MODULE MoreMath;

(* misc. extra math functions *)
(* more functions added, J. Andrea, Aug.13/91 *)
(* J. Andrea, 1985 *)
(* This code may be freely used and distributed, it may not be sold. *)

EXPORT QUALIFIED   IModulus, CardPower, RealPower, IntPower, entier,
                   MinReal, MaxReal, MinCard, MaxCard, MinInt, MaxInt,
                   SizeCard, SizeInt, CalcPi, Log10, Log2;


    PROCEDURE IModulus( a, b :INTEGER ) :INTEGER;
    (* return the integer modulus of two numbers
       handles a negative 'a' value (unlike the languages built in MOD) *)


    PROCEDURE CardPower( base, exponent :CARDINAL ) :CARDINAL;
    (* raise a cardinal to a cardinal power *)

    PROCEDURE RealPower( base :REAL; exponent :CARDINAL ) :REAL;
    (* raise a real to a cardinal power *)

    PROCEDURE IntPower( base, exponent :INTEGER ) :INTEGER;
    (* raise an integer to an integer power *)


    PROCEDURE entier( a :REAL ) :INTEGER;
    (* returns an INTEGER; as per definition in Seafarer's Guide pp. 36 *)


    PROCEDURE MinReal( a, b :REAL ) :REAL;
    (* return the smaller of 'a' and 'b' *)

    PROCEDURE MaxReal( a, b :REAL ) :REAL;
    (* return the larger of 'a' and 'b' *)


    PROCEDURE MinCard( a, b :CARDINAL ) :CARDINAL;
    (* return the smaller of 'a' and 'b' *)

    PROCEDURE MaxCard( a, b :CARDINAL ) :CARDINAL;
    (* return the larger of 'a' and 'b' *)


    PROCEDURE MinInt( a, b :INTEGER ) :INTEGER;
    (* return the smaller of 'a' and 'b' *)

    PROCEDURE MaxInt( a, b :INTEGER ) :INTEGER;
    (* return the larger of 'a' and 'b' *)


    PROCEDURE SizeCard( a :CARDINAL ) :CARDINAL;
    (* return the number of digits in 'a' *)

    PROCEDURE SizeInt( a :INTEGER ) :CARDINAL;
    (* return the number of digits in 'a', including a minus sign *)


    PROCEDURE CalcPi() :REAL;
    (* Return the value of Pi at maximum precision.
       From a method by  J. Borwein and P. Borwein,
       see:  "Ramanujan and Pi", Scientific American, Feb. 1988 *)


    PROCEDURE Log10( x :REAL ) :REAL;
    (* Return log base 10 of x *)
    
    PROCEDURE Log2( x :REAL ) :REAL;
    (* Return log base 2 of x *)

END MoreMath.
