GENERIC MODULEFloatTrans ();
*Arithmetic for Modula-3, see doc for detailsAbstract: Generic wrapper routines for (mainly) transcendent functions
It was xReal32.m3 by Harry George Initially implemented a wrappers on Math, but need an assembler rendition.
12/15/95 Harry George Initial version, via wrappers on Math
IMPORT Math; <* UNUSED *> CONST Module = "FloatTrans."; PROCEDURE---- Exponential and Logarithm functions ----Abs (x: T; ): T = BEGIN RETURN ABS(x); END Abs; PROCEDUREAbsSqr (x: T; ): T = BEGIN RETURN x * x; END AbsSqr;
PROCEDURE---- Trigonometric functions ----Exp (x: T; ): T = (* returns E^x. *) BEGIN RETURN FLOAT(Math.exp(FLOAT(x, LONGREAL)), T); END Exp; PROCEDUREExpm1 (x: T; ): T = (* returns (E^x)-1, even for small x. *) BEGIN RETURN FLOAT(Math.expm1(FLOAT(x, LONGREAL)), T); END Expm1; PROCEDURELn (x: T; ): T = (* returns the natural logarithm of x (base E). *) BEGIN RETURN FLOAT(Math.log(FLOAT(x, LONGREAL)), T); END Ln; PROCEDURELn1p (x: T; ): T = (* returns log(1+x), even for small x. *) BEGIN RETURN FLOAT(Math.log1p(FLOAT(x, LONGREAL)), T); END Ln1p; PROCEDURELg (x: T; ): T = (* returns the base 10 logarithm of x. *) BEGIN RETURN FLOAT(Math.log10(FLOAT(x, LONGREAL)), T); END Lg; PROCEDURELb (x: T; ): T = (* returns the base 2 logarithm of x. *) BEGIN RETURN FLOAT(Math.log(FLOAT(x, LONGREAL)), T) / FLOAT(Math.log(2.0D0), T); END Lb; PROCEDURELog (x, y: T; ): T = (* returns the base y logarithm of x. *) BEGIN RETURN FLOAT(Math.log(FLOAT(x, LONGREAL)), T) / FLOAT( Math.log(FLOAT(y, LONGREAL)), T); END Log; PROCEDUREPow (x, y: T; ): T = (* returns x^y. *) BEGIN RETURN FLOAT(Math.pow(FLOAT(x, LONGREAL), FLOAT(y, LONGREAL)), T); END Pow; PROCEDURESqRt (x: T; ): T = (* returns the square root of x. *) BEGIN RETURN FLOAT(Math.sqrt(FLOAT(x, LONGREAL)), T); END SqRt;
PROCEDURE---- Hyperbolic trigonometric functions ----Cos (x: T; ): T = (* returns the cosine of x radians. *) BEGIN RETURN FLOAT(Math.cos(FLOAT(x, LONGREAL)), T); END Cos; PROCEDURESin (x: T; ): T = (* returns the sine of x radians. *) BEGIN RETURN FLOAT(Math.sin(FLOAT(x, LONGREAL)), T); END Sin; PROCEDURETan (x: T; ): T = (* returns the tangent of x radians. *) BEGIN RETURN FLOAT(Math.tan(FLOAT(x, LONGREAL)), T); END Tan; PROCEDUREArcCos (x: T; ): T = (* returns the arc cosine of x in radians. *) BEGIN RETURN FLOAT(Math.acos(FLOAT(x, LONGREAL)), T); END ArcCos; PROCEDUREArcSin (x: T; ): T = (* returns the arc sine of x in radians. *) BEGIN RETURN FLOAT(Math.asin(FLOAT(x, LONGREAL)), T); END ArcSin; PROCEDUREArcTan (x: T; ): T = (* returns the arc tangent of x in radians. *) BEGIN RETURN FLOAT(Math.atan(FLOAT(x, LONGREAL)), T); END ArcTan; PROCEDUREArcTan2 (y, x: T; ): T = (* returns the arc tangent of y/x in radians. *) BEGIN RETURN FLOAT(Math.atan2(FLOAT(y, LONGREAL), FLOAT(x, LONGREAL)), T); END ArcTan2;
PROCEDURECosH (x: T; ): T = (* returns the hyperbolic cosine of x. *) BEGIN RETURN FLOAT(Math.cosh(FLOAT(x, LONGREAL)), T); END CosH; PROCEDURESinH (x: T; ): T = (* returns the hyperbolic sine of x. *) BEGIN RETURN FLOAT(Math.sinh(FLOAT(x, LONGREAL)), T); END SinH; PROCEDURETanH (x: T; ): T = (* returns the hyperbolic tangent of x. *) BEGIN RETURN FLOAT(Math.tanh(FLOAT(x, LONGREAL)), T); END TanH; PROCEDUREArCosH (x: T; ): T = (* returns the inverse hyperbolic cosine of x *) BEGIN RETURN FLOAT(Math.acosh(FLOAT(x, LONGREAL)), T); END ArCosH; PROCEDUREArSinH (x: T; ): T = (* returns the inverse hyperbolic sine of x *) BEGIN RETURN FLOAT(Math.asinh(FLOAT(x, LONGREAL)), T); END ArSinH; PROCEDUREArTanH (x: T; ): T = (* returns the inverse hyperbolic tangent of x *) BEGIN RETURN FLOAT(Math.atanh(FLOAT(x, LONGREAL)), T); END ArTanH; PROCEDURESgn (x: T; ): T = BEGIN IF x > Zero THEN RETURN One; ELSIF x < Zero THEN RETURN MinusOne; ELSE RETURN Zero; END; END Sgn; BEGIN END FloatTrans.