(* Copyright (C) 1991, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* Last modified on Thu Nov 21 11:32:06 PST 1991 by muller *) (* modified on Wed Sep 25 01:21:28 1991 by kalsow *) UNSAFE MODULE ExtendedFloat; IMPORT Math, FPU; PROCEDURE Scalb(x: T; n: INTEGER): T = BEGIN RETURN FLOAT (Math.ldexp (FLOAT (x, LONGREAL), n), T); END Scalb; PROCEDURE Logb(<*UNUSED*> x: T): T = BEGIN <* ASSERT FALSE *> END Logb; PROCEDURE ILogb(<*UNUSED*> x: T): INTEGER = BEGIN <* ASSERT FALSE *> END ILogb; PROCEDURE NextAfter(<*UNUSED*> x, y: T): T = BEGIN <* ASSERT FALSE *> END NextAfter; PROCEDURE CopySign(x, y: T): T = VAR xx, yy: FPU.ExtendedRep; BEGIN xx := LOOPHOLE (x, FPU.ExtendedRep); yy := LOOPHOLE (y, FPU.ExtendedRep); xx.sign := yy.sign; RETURN LOOPHOLE (xx, T); END CopySign; PROCEDURE Finite(<*UNUSED*> x: T): BOOLEAN = BEGIN RETURN TRUE; END Finite; PROCEDURE IsNaN(x: T): BOOLEAN = VAR xx := LOOPHOLE (x, FPU.ExtendedRep); BEGIN RETURN (xx.sign # 0) AND (xx.exponent = 0); END IsNaN; PROCEDURE Sign(x: T): [0..1] = VAR xx := LOOPHOLE (x, FPU.ExtendedRep); BEGIN RETURN xx.sign; END Sign; PROCEDURE Differs(x, y: T): BOOLEAN = BEGIN RETURN (NOT (IsNaN (x) OR IsNaN (y))) AND (x # y); END Differs; PROCEDURE Unordered(x, y: T): BOOLEAN = BEGIN RETURN IsNaN (x) OR IsNaN (y); END Unordered; PROCEDURE Sqrt(x: T): T = BEGIN RETURN FLOAT (Math.sqrt (FLOAT (x, LONGREAL)), T); END Sqrt; PROCEDURE Class(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; BEGIN END ExtendedFloat.