extended format
NumberType: TYPE = {normal, zero, infinity, nan};
Extended:
TYPE =
RECORD [
type: NumberType,
sign: BOOL,
exp: INTEGER,
frac: LONG CARDINAL];
modes
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)
NormalizationMode: TYPE = {warning, normalizing};
Mode:
TYPE =
RECORD [
nm: NormalizationMode ← warning,
round: RoundingMode ← rn];
Constants
PlusZero: REAL = LOOPHOLE[LONG[00000000000b]];
MinusZero: REAL = LOOPHOLE[20000000000b];
PlusInfinity: REAL = LOOPHOLE[17740000000b];
MinusInfinity: REAL = LOOPHOLE[37740000000b];
TrapNonTrappingNaN: LONG CARDINAL = LONG[1];
TrapTrappingNaN: LONG CARDINAL = LONG[2];
Exceptions
Flag: TYPE = BOOL ← FALSE;
Exception:
TYPE = {
fixOverflow, inexactResult, invalidOperation, divisionByZero, overflow, underflow};
ExceptionFlags: TYPE = PACKED ARRAY Exception OF Flag;
NoExceptions: ExceptionFlags = ALL[FALSE];
Operations
RealException: SIGNAL [flags: ExceptionFlags];
RealToExtended: PROC [a: REAL] RETURNS [Extended];
ExtendedToReal: PROC [e: Extended] RETURNS [REAL];
Abs: PROC [a: REAL] RETURNS [REAL];
Negate: PROC [a: REAL] RETURNS [REAL];
PairToReal: PROC [fr: LONG INTEGER, exp10: INTEGER] RETURNS [REAL];
}.