GENERIC MODULEFloatBasic ();
Arithmetic for Modula-3, see doc for detailsAbstract: Generic wrapper routines for basic operations of float types
IMPORT Arithmetic AS Arith; <* UNUSED *> CONST Module = "FloatBasic."; PROCEDUREFromInteger (x: INTEGER; ): T = BEGIN RETURN FLOAT(x, T) END FromInteger; PROCEDUREAdd (x, y: T; ): T = BEGIN RETURN x + y END Add; PROCEDURESub (x, y: T; ): T = BEGIN RETURN x - y END Sub; PROCEDURENeg (x: T; ): T = BEGIN RETURN -x END Neg; PROCEDUREConj (x: T; ): T = BEGIN RETURN x END Conj; PROCEDUREIsZero (x: T; ): BOOLEAN = BEGIN RETURN x = Zero; END IsZero; <* INLINE *> PROCEDURECheckDivisor (x: T; ) RAISES {Arith.Error} = BEGIN IF x = Zero THEN RAISE Arith.Error(NEW(Arith.ErrorDivisionByZero).init()); END; END CheckDivisor; PROCEDUREMul (x, y: T; ): T = BEGIN RETURN x * y END Mul; PROCEDUREDiv (x, y: T; ): T RAISES {Arith.Error} = BEGIN CheckDivisor(y); RETURN x / y END Div; PROCEDUREMod (<* UNUSED *> x: T; y: T; ): T RAISES {Arith.Error} = BEGIN CheckDivisor(y); RETURN Zero END Mod; PROCEDUREDivMod (x, y: T; ): QuotRem RAISES {Arith.Error} = BEGIN CheckDivisor(y); RETURN QuotRem{x / y, Zero} END DivMod; PROCEDUREIntMod (x, y: T; ): T RAISES {Arith.Error} = BEGIN CheckDivisor(y); RETURN x MOD y END IntMod; PROCEDURERec (x: T; ): T RAISES {Arith.Error} = BEGIN CheckDivisor(x); RETURN One / x END Rec; PROCEDUREScaleInt (x: T; y: INTEGER; ): T = BEGIN RETURN x * FLOAT(y, T) END ScaleInt; BEGIN END FloatBasic.