-- RealOps.mesa
-- Last Modified: October 27, 1980  11:24 AM
-- Copyright Xerox Corporation 1980
DIRECTORY
  Real USING [ExceptionFlags, UsualExceptions];
RealOps: DEFINITIONS =
  BEGIN
  -- See IEEE floating point standard for more information.
  -- Modes
  --   rn:  Round to nearest (unbiased).
  --   rz:  Round to zero (truncate).
  --   rp:  Round to plus infinity (round up).
  --   rm:  Round to minus infinity (round down).
  RoundingMode: TYPE = MACHINE DEPENDENT{rn, rz, rm, rp};
  DefaultRoundingMode: RoundingMode = rn;
  InfinityMode: TYPE = MACHINE DEPENDENT{projective, affine};
  DefaultInfinityMode: InfinityMode = projective;
  -- Affine mode has two infinities (positive and negative).
  -- Projective mode has only one (unsigned).
  NormalizationMode: TYPE = MACHINE DEPENDENT{warning, normalizing};
  DefaultNormalizationMode: NormalizationMode = warning;
  -- Warning mode recognizes operand's unnormalized character.
  -- Normalizing mode (internally) normalizes operands before operating on them.
  Mode: TYPE = MACHINE DEPENDENT RECORD [
    blank(0:0..5): [0..77B] ← NULL,
    im(0:6..6): InfinityMode ← projective,
    nm(0:7..7): NormalizationMode ← warning,
    round(0:8..9): RoundingMode ← rn,
    traps(0:10..15): Real.ExceptionFlags ← Real.UsualExceptions];
  DefMode: Mode =
    [blank: 0, im: projective, nm: warning,
      round: rn, traps: Real.UsualExceptions];
  FixMode: Mode =
    [blank: 0, im: projective, nm: warning,
      round: rz, traps: Real.UsualExceptions];
  -- The Mode applies only to operations called through this interface.
  SetMode: PROC [new: Mode] RETURNS [old: Mode];
  GetMode: PROC RETURNS [Mode];
  -- Operations
  FAdd: PROC [a, b: REAL, m: Mode ← DefMode] RETURNS [REAL];
  FSub: PROC [a, b: REAL, m: Mode ← DefMode] RETURNS [REAL];
  FMul: PROC [a, b: REAL, m: Mode ← DefMode] RETURNS [REAL];
  FDiv: PROC [a, b: REAL, m: Mode ← DefMode] RETURNS [REAL];
  FComp: PROC [a, b: REAL, m: Mode ← DefMode] RETURNS [INTEGER];
  FRem: PROC [a, b: REAL, m: Mode ← DefMode] RETURNS [REAL];
  Float: PROC [a: LONG INTEGER, m: Mode ← DefMode] RETURNS [REAL];
  RoundLI: PROC [a: REAL, m: Mode ← DefMode] RETURNS [LONG INTEGER];
  RoundI: PROC [a: REAL, m: Mode ← DefMode] RETURNS [INTEGER];
  RoundC: PROC [a: REAL, m: Mode ← DefMode] RETURNS [CARDINAL];
  InitReals: PROC;
  END.
July 5, 1980  3:16 PM; Stewart, created
September 28, 1980  8:06 PM; Stewart, Deleted individual mode procs.
October 27, 1980  11:23 AM; Stewart, Fixed Mode type for LIB use.