GENERIC INTERFACEFloatBasic (R, RTy, RFl);
Arithmetic for Modula-3, see doc for detailsAbstract: Generic wrapper routines for basic operations of float types
FROM Arithmetic IMPORT Error; CONST Brand = RTy.Brand; TYPE T = R.T; QuotRem = RECORD quot, rem: T; END; Array = REF ARRAY OF T; CONST Zero = FLOAT(0.0D0, T); One = FLOAT(1.0D0, T); Two = FLOAT(2.0D0, T); MinusOne = FLOAT(-1.0D0, T); Half = FLOAT(0.5D0, T);used for Vector.Min, Vector.Max
VAR (* CONST after initialization *) NegInf: T; PosInf: T; Nan : T; CONST Equal = RTy.Equal; Compare = RTy.Compare; <* INLINE *> PROCEDURE FromInteger (x: INTEGER; ): T; <* INLINE *> PROCEDURE Add (x, y: T; ): T; (* x+y *) <* INLINE *> PROCEDURE Sub (x, y: T; ): T; (* x-y *) <* INLINE *> PROCEDURE Neg (x: T; ): T; (* -x *) <* INLINE *> PROCEDURE Conj (x: T; ): T; (* x *) <* INLINE *> PROCEDURE IsZero (x: T; ): BOOLEAN; <* INLINE *> PROCEDURE Mul (x, y: T; ): T; (* x*y *) <* INLINE *> PROCEDURE Div (x, y: T; ): T RAISES {Error}; (* x/y *) <* INLINE *> PROCEDURE Rec (x: T; ): T RAISES {Error}; (* 1/x *) <* INLINE *> PROCEDURE Mod (x, y: T; ): T RAISES {Error}; (* normally 0, because there is no restriction for division for rational numbers *) <* INLINE *> PROCEDURE DivMod (x, y: T; ): QuotRem RAISES {Error}; (*return x/y and the remainder 0 *) <* INLINE *> PROCEDURE IntMod (x, y: T; ): T RAISES {Error}; (* x mod y *) CONST Scale = Mul; <* OBSOLETE *> PROCEDURE ScaleInt (x: T; y: INTEGER; ): T; (* x*y *)---- Floating point representations ----
CONST Scalb = RFl.Scalb; ILogb = RFl.ILogb; END FloatBasic.