-- DragonRealFns.mesa
-- Last Update by Stewart,  August 27, 1982 11:21 am

RealFns: CEDAR DEFINITIONS =
  BEGIN

  Exp: PROC [REAL] RETURNS [REAL];
  -- For an input argument n, returns en (e=2.718...).
  -- Computed by continued fractions.

  Log: PROC [base, arg: REAL] RETURNS [REAL];
  -- Computes logarithm to the base base of arg.
  -- Computed by Ln(arg)/Ln(base).

  Ln: PROC [REAL] RETURNS [REAL];
  -- Computes the natural logarithm (base e) of the input argument.

  SqRt: PROC [REAL] RETURNS [REAL];
  -- Calculates the square root of the input value by Newton's iteration.

  Root: PROC [index, arg: REAL] RETURNS [REAL];
  -- Calculates the index root of arg by e(Ln(arg)/index).

  Power: PROC [base, exponent: REAL] RETURNS [REAL];
  -- Calculates base to the exponent power by e(exponent*Ln(base)).

  Sin: PROC [radians: REAL] RETURNS [sin: REAL];
  SinDeg: PROC [degrees: REAL] RETURNS [sin: REAL];
  Cos: PROC [radians: REAL] RETURNS [cos: REAL];
  CosDeg: PROC [degrees: REAL] RETURNS [cos: REAL];
  Tan: PROC [radians: REAL] RETURNS [tan: REAL];
  TanDeg: PROC [degrees: REAL] RETURNS [tan: REAL];
  -- Computes the trigonometric function by polynomial;
  --   good to 7.33 decimal places.

  ArcTan: PROC [y, x: REAL] RETURNS [radians: REAL];
  ArcTanDeg: PROC [y, x: REAL] RETURNS [degrees: REAL];
  -- Good to 8.7 decimal places.

  -- AlmostZero returns TRUE if ABS[x] is smaller than 2↑distance.
  AlmostZero: PROC [x: REAL, distance: [-126..127]] RETURNS [BOOLEAN];

  -- AlmostEqual returns TRUE if ABS[x-y]/MAX[ABS[x],ABS[y]]
  --   is smaller than 2↑distance.  That is, the exponent of the result
  --   of the subtract must be ABS[distance] smaller than the larger
  --   exponent of the operands.
  AlmostEqual: PROC [y, x: REAL, distance: [-126..0]] RETURNS [BOOLEAN];

  -- In both these procedures, distance should be negative!

  END.