-- file IeeeFloat.Mesa
-- Last modified by Satterthwaite, April 21, 1980 4:16 PM
-- Last modified by Bruce, July 7, 1980 5:37 PM
-- adaptation of Real.Mesa for compiler and Ieee.mesa for debugger use
DIRECTORY
Inline USING [BITAND, LongNumber];
Real: DEFINITIONS IMPORTS Inline =
BEGIN
-- modes
NumberType: TYPE = {normal, zero, infinity, nan};
RoundingMode: TYPE = {rn, rz, rm, rp};
-- rn: Round to nearest (unbiased)
-- rz: Round to zero (truncate)
-- rp: Round to plus infinity (round up)
-- rm: Round to minus infinity (round down)
-- Constants
PlusZero: REAL = LOOPHOLE[LONG[00000000000B]];
MinusZero: REAL = LOOPHOLE[20000000000B];
PlusInfinity: REAL = LOOPHOLE[17740000000B];
MinusInfinity: REAL = LOOPHOLE[37740000000B];
NonTrappingNaN: LONG CARDINAL = 1;
-- Exceptions
Flag: TYPE = BOOLEAN ← FALSE;
Exception: TYPE =
{fixOverflow, inexactResult, invalidOperation, divisionByZero, overflow, underflow};
ExceptionFlags: TYPE = PACKED ARRAY Exception OF Flag;
NoExceptions: ExceptionFlags = ALL[FALSE];
-- Operations
FloatingPointException: SIGNAL [flags: ExceptionFlags];
Abs: PROCEDURE [a: REAL] RETURNS [REAL];
Negate: PROCEDURE [a: REAL] RETURNS [REAL];
PairToReal: PROCEDURE [fr: LONG INTEGER, exp10: INTEGER] RETURNS [REAL];
-- from Ieee.mesa for debugger output routines
Details: TYPE = MACHINE DEPENDENT RECORD [
sign: BOOLEAN,
sticky: BOOLEAN,
blank: [0..7777B],
type: NumberType];
Ext: TYPE = RECORD [
det: Details,
exp: INTEGER,
frac: Inline.LongNumber];
DenormalizedExponent: INTEGER = -127;
ExponentBias: INTEGER = 127;
ExponentMask: INTEGER = 077600B;
ExponentShift: INTEGER = 7;
ExpSingleMin: INTEGER = -126;
HalfLC: LONG CARDINAL = LOOPHOLE[20000000000B];
HiBit: CARDINAL = 100000B;
HiddenBit: CARDINAL = 100000B;
HiFractionMask: INTEGER = 177B;
NaNExponent: INTEGER = 128;
LN: PROCEDURE [r: LONG UNSPECIFIED] RETURNS [Inline.LongNumber] = INLINE {
RETURN[LOOPHOLE[r, Inline.LongNumber]]};
BitOn: PROCEDURE [a, b: UNSPECIFIED] RETURNS [BOOLEAN] = INLINE {
RETURN[Inline.BITAND[a, b]#0]};
Normalized: PROCEDURE [g: INTEGER] RETURNS [BOOLEAN] = INLINE {
RETURN [Inline.BITAND[g, HiddenBit]#0]};
ADC3: PROCEDURE [a, b, c: CARDINAL] RETURNS [CARDINAL, CARDINAL] = INLINE {
s: Inline.LongNumber;
s.lc ← LONG[a]+LONG[b]+LONG[c];
RETURN[s.highbits, s.lowbits]};
END.