(*---------------------------------------------------------------------------
    :Program.    NewMathLib.mod
    :Author.     Philippe Gressly and John Bysäth
    :Address.    Näfenhaus, CH-8926 Kappel a/Albis
    :History.    V2.6, Philippe Gressly / John Bysäht, July 89
    :Copyright.  PD or Shareware (I like Shareware better).
    :Language.   Modula-II
    :Translator. M2Amiga v3.2
    :Imports.    RealConversions, NewMathLib
    :Contents.   More Formulas then MathLibLong
---------------------------------------------------------------------------*)
IMPLEMENTATION MODULE NewMathLib;


FROM MathLibLong IMPORT exp, ln, sqrt, sin, cos, arctan;


CONST PI   = 3.141592653589793;
      E    = 2.718281828459045;
      ln10 = 2.302585         ; (* bitte ergänzen wenn bekannt *)


PROCEDURE SQRT(x: LONGREAL): LONGREAL;
BEGIN
   IF x < 0.0 THEN ArEr := ArNDef; RETURN 0.0 END;
   ArEr := ArNoEr;
   RETURN sqrt(x)
END SQRT;



PROCEDURE EXP(x: LONGREAL): LONGREAL;
BEGIN
   IF x > 709.0 THEN ArEr := ArOverFl; RETURN x END;
   ArEr := ArNoEr;
   RETURN exp(x)
END EXP;


PROCEDURE LN(x: LONGREAL): LONGREAL;
BEGIN
   IF x <=  0.0 THEN ArEr := ArNDef; RETURN 0.0 END;
   ArEr := ArNoEr;
   RETURN ln(x)
END LN;


PROCEDURE LOG(x:LONGREAL): LONGREAL;
BEGIN
   IF x <= 0.0 THEN ArEr := ArNDef; RETURN 0.0 END;
   ArEr := ArNoEr;
   RETURN LN(x) / ln10
END LOG;


PROCEDURE SIN(x: LONGREAL): LONGREAL;
BEGIN
   ArEr := ArNoEr;
   RETURN sin(x)
END SIN;


PROCEDURE COS(x: LONGREAL): LONGREAL;
BEGIN
   ArEr := ArNoEr;
   RETURN cos(x)
END COS;


PROCEDURE TAN(x: LONGREAL): LONGREAL;
BEGIN
   IF cos(x) = 0.0 THEN ArEr := ArNDef; RETURN 0.0 END;
   ArEr := ArNoEr;
   RETURN sin(x) / cos(x)
END TAN;



PROCEDURE ARCTAN(x:LONGREAL): LONGREAL;
BEGIN
   ArEr := ArNoEr;
   RETURN arctan(x)
END ARCTAN;


PROCEDURE SINh(x: LONGREAL): LONGREAL;
BEGIN
   ArEr := ArNoEr;
   RETURN (EXP(x) - EXP(-x)) / 2.0
END SINh;


PROCEDURE COSh(x: LONGREAL): LONGREAL;
BEGIN
   ArEr := ArNoEr;
   RETURN (EXP(x) + EXP(-x)) / 2.0
END COSh;

PROCEDURE TANh(x: LONGREAL): LONGREAL;
BEGIN
   ArEr := ArNoEr;
   RETURN SINh(x) / COSh(x)
END TANh;


PROCEDURE ARCSINh(x:LONGREAL): LONGREAL;
BEGIN
   ArEr := ArNoEr;
   RETURN LN(x + SQRT(x * x + 1.0))
END ARCSINh;


PROCEDURE ARCCOSh(x:LONGREAL): LONGREAL;
BEGIN
   IF x < 1.0 THEN ArEr := ArNDef; RETURN 0.0 END;
   ArEr := ArNoEr;
   RETURN LN(x + SQRT(x * x - 1.0))
END ARCCOSh;


PROCEDURE ARCTANh(x:LONGREAL): LONGREAL;
BEGIN
   IF (x <= -1.0) OR (x >= 1.0) THEN ArEr := ArNDef; RETURN 0.0 END;
   ArEr := ArNoEr;
   RETURN LN((1.0 + x)/(1.0-x))/2.0
END ARCTANh;



PROCEDURE FACT(x: LONGREAL): LONGREAL;
VAR r: LONGREAL;
BEGIN
   IF (x > 170.0) THEN ArEr := ArOverFl; RETURN 1.0 END;
   IF (x < 0.0) OR (x # LONGREAL(LONGINT(x))) THEN
      ArEr := ArNDef; RETURN 0.0
   END;
   ArEr := ArNoEr;
   IF x <= 1.0 THEN RETURN 1.0 END;
   r := 1.0;
   WHILE x > 1.0 DO
      r := r * x;
      x := x - 1.0
   END;
   RETURN r
END FACT;


PROCEDURE SIGN(x: LONGREAL): LONGREAL;
BEGIN
   ArEr := ArNoEr;
   IF x < 0.0 THEN RETURN -1.0
   ELSIF x > 0.0 THEN RETURN 1.0
   ELSE RETURN 0.0
   END
END SIGN;


PROCEDURE DegToRad(x: LONGREAL): LONGREAL;
BEGIN
   ArEr := ArNoEr;
   RETURN x / 180.0 * PI
END DegToRad;


PROCEDURE RadToDeg(x: LONGREAL): LONGREAL;
BEGIN
   ArEr := ArNoEr;
   RETURN x / PI * 180.0
END RadToDeg;


BEGIN
  ArEr := ArNoEr
END NewMathLib.

