Copyright (C) 1994, Digital Equipment Corp.
UNSAFE MODULE; IMPORT FPU, LongRealRep, FloatMode, LongFloat; PROCEDURE ExtendedFloat Scalb (x: T; n: INTEGER): T = BEGIN RETURN FLOAT (FPU.ldexp (FLOAT (x, LONGREAL), n), T); END Scalb; PROCEDURELogb (<*UNUSED*> x: T): T = BEGIN <* ASSERT FALSE *> END Logb; PROCEDUREILogb (<*UNUSED*> x: T): INTEGER = BEGIN <* ASSERT FALSE *> END ILogb; PROCEDURENextAfter (<*UNUSED*> x, y: T): T = BEGIN <* ASSERT FALSE *> END NextAfter; PROCEDURECopySign (x, y: T): T = VAR res := x; BEGIN LOOPHOLE (res, LongRealRep.T).sign := LOOPHOLE (y, LongRealRep.T).sign; RETURN res; END CopySign; PROCEDUREFinite (<*UNUSED*> x: T): BOOLEAN = BEGIN RETURN TRUE; END Finite; PROCEDUREIsNaN (x: T): BOOLEAN = VAR xx := LOOPHOLE (x, LongRealRep.T); BEGIN RETURN (xx.sign # 0) AND (xx.exponent = 0); END IsNaN; PROCEDURESign (x: T): [0..1] = VAR xx := LOOPHOLE (x, LongRealRep.T); BEGIN RETURN xx.sign; END Sign; PROCEDUREDiffers (x, y: T): BOOLEAN = BEGIN RETURN (NOT (IsNaN (x) OR IsNaN (y))) AND (x # y); END Differs; PROCEDUREUnordered (x, y: T): BOOLEAN = BEGIN RETURN IsNaN (x) OR IsNaN (y); END Unordered; PROCEDURESqrt (x: T): T = BEGIN RETURN FLOAT (FPU.sqrt (FLOAT (x, LONGREAL)), T); END Sqrt; PROCEDUREClass (x: T): IEEEClass = BEGIN IF IsNaN (x) THEN RETURN IEEEClass.SignalingNaN; ELSIF (x = 0.0x+0) THEN RETURN IEEEClass.Zero; ELSE RETURN IEEEClass.Normal; END; END Class; PROCEDUREFromDecimal ( sign: [0..1]; READONLY digits: ARRAY OF [0..9]; exp: INTEGER): T RAISES {FloatMode.Trap} = BEGIN RETURN FLOAT (LongFloat.FromDecimal (sign, digits, exp), T); END FromDecimal; PROCEDUREToDecimal (x: T): DecimalApprox = BEGIN RETURN LongFloat.ToDecimal (FLOAT (x, LONGREAL)); END ToDecimal; BEGIN END ExtendedFloat.