home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 12 / tricks / mathe0.mod < prev    next >
Encoding:
Modula Implementation  |  1990-09-12  |  5.0 KB  |  226 lines

  1. (* ------------------------------------------------------ *)
  2. (*                     MATHE0.MOD                         *)
  3. (*    erweitertes Mathe-Bibilotheks-Modul für Modula-2    *)
  4. (*          (c) 1990  Jürgen Walter & TOOLBOX             *)
  5. (* ------------------------------------------------------ *)
  6. IMPLEMENTATION MODULE Mathe0;
  7.  
  8. FROM MathLib0 IMPORT sqrt, arctan, exp,
  9.                      ln, real, entier;
  10.  
  11. CONST
  12.   pi = 3.14159;
  13.   
  14.   PROCEDURE fraction(x : REAL) : REAL;
  15.   VAR
  16.     Rueck         : REAL;
  17.     i, Vorzeichen : INTEGER;
  18.     Test          : BOOLEAN;
  19.   BEGIN
  20.     Vorzeichen := sgn(x);
  21.     x := ABS(x);
  22.     IF real(entier(x)) > x THEN   (* Nachkommaanteil > .5 *)
  23.       Rueck := x - real(entier(x - 0.5));
  24.     ELSE
  25.       Rueck := x - real(entier(x));
  26.     END;
  27.     IF Vorzeichen = -1 THEN
  28.       Rueck := -1.0 * Rueck;
  29.     END;
  30.     RETURN Rueck;
  31.   END fraction;
  32.  
  33.   PROCEDURE sgn(x : REAL) : INTEGER;
  34.   VAR
  35.     Rueck : INTEGER;
  36.   BEGIN
  37.     IF x > 0.0 THEN
  38.       Rueck := 1;
  39.     ELSIF x < 0.0 THEN
  40.       Rueck := -1;
  41.     ELSE
  42.       Rueck := 0;
  43.     END;
  44.     RETURN Rueck;
  45.   END sgn;
  46.  
  47.   PROCEDURE power(x, n : REAL) : REAL;
  48.   (* Die Prozedur "power" fängt als einzige einen Fehler  *)
  49.   (* bei der Übergabe der Parameter ab, ist x = 0 oder    *)
  50.   (* x < 0 und der Nachkommaanteil eine gebrochene Zahl,  *)
  51.   (* so wird eine Null zurückgegeben.                     *)
  52.   VAR
  53.     Rueck, nn : REAL;
  54.     i         : CARDINAL;
  55.     Test      : BOOLEAN;
  56.   BEGIN
  57.                 (* Vorzeichen wird als positiv angenommen *)
  58.     Test := TRUE;
  59.     nn   := ABS(fraction(n));
  60.     IF n = 0.0 THEN
  61.                         (* Potenz ist 0 => Potenzwert = 1 *)
  62.       Rueck := 1.0;
  63.       RETURN Rueck;
  64.     END;
  65.         (* soll das Programm bei einem Fehler aussteigen, *)
  66.         (* dann diese IF-Anweisung entfernen ...          *)
  67.     IF ((nn > 0.0) AND (x < 0.0)) OR (x = 0.0) THEN
  68.       Rueck := 0.0;
  69.       RETURN Rueck;
  70.     END;
  71.     IF x < 0.0 THEN
  72.       x := ABS(x); (* Vorzeichen wird als negativ erkannt *)
  73.       Test := FALSE;
  74.     END;
  75.     IF n >= 1.0 THEN             (* Berechnung der Potenz *)
  76.       Rueck := exp(n * ln(x));
  77.     ELSIF nn > 0.0 THEN
  78.       Rueck := exp(n * ln(x));
  79.     ELSE                         (* Berechnung der Wurzel *)
  80.       Rueck := exp(ln(x) / (1.0 / n));
  81.     END;
  82.     IF Test = FALSE THEN
  83.       IF fraction(n / 2.0) # 0.0 THEN
  84.         Rueck := -Rueck;
  85.       ELSE
  86.         Rueck := Rueck;
  87.       END;
  88.     END;
  89.     RETURN Rueck;
  90.   END power;
  91.  
  92.   PROCEDURE fact(x : REAL) : REAL;
  93.   VAR
  94.     Rueck, r : REAL;
  95.     j, k     : INTEGER;
  96.   BEGIN
  97.     Rueck := 1.0;
  98.     k     := entier(x);
  99.     IF x = 0.0 THEN
  100.       RETURN 1.0;
  101.     END;
  102.     FOR j := 1 TO k DO
  103.       r     := real(j);
  104.       Rueck := Rueck * r;
  105.     END;
  106.     RETURN Rueck;
  107.   END fact;
  108.  
  109.   PROCEDURE Bi(n, r : REAL) : REAL;
  110.   VAR
  111.     NMinusR, Rueck : REAL;
  112.   BEGIN
  113.     NMinusR := n - r;
  114.     Rueck   := fact(n) / (fact(r) * fact(NMinusR));
  115.     RETURN Rueck;
  116.   END Bi;
  117.  
  118.   PROCEDURE arccos(x : REAL) : REAL;
  119.   VAR
  120.     Rueck : REAL;
  121.   BEGIN
  122.     Rueck := (pi / 2.0) - arcsin(x);
  123.     RETURN Rueck;
  124.   END arccos;
  125.  
  126.   PROCEDURE arcsin(x : REAL) : REAL;
  127.   VAR
  128.     Rueck : REAL;
  129.   BEGIN
  130.     Rueck := (pi / 2.0) - arccos(x);
  131.     RETURN Rueck;
  132.   END arcsin;
  133.  
  134.   PROCEDURE arccot(x : REAL) : REAL;
  135.   VAR
  136.     Rueck : REAL;
  137.   BEGIN
  138.     Rueck := arctan(1.0 / x);
  139.     RETURN Rueck;
  140.   END arccot;
  141.  
  142.   PROCEDURE sinh(x : REAL) : REAL;
  143.   VAR
  144.     Rueck : REAL;
  145.   BEGIN
  146.     Rueck := 0.5 * (exp(x) - exp(-x));
  147.     RETURN Rueck;
  148.   END sinh;
  149.  
  150.   PROCEDURE cosh(x : REAL) : REAL;
  151.   VAR
  152.     Rueck : REAL;
  153.   BEGIN
  154.     Rueck := 0.5 * (exp(x) + exp(-x));
  155.     RETURN Rueck;
  156.   END cosh;
  157.  
  158.   PROCEDURE tanh(x : REAL) : REAL;
  159.   VAR
  160.     Rueck : REAL;
  161.   BEGIN
  162.     Rueck := (exp(x) - exp(-x)) / (exp(x) + exp(-x));
  163.     RETURN Rueck;
  164.   END tanh;
  165.  
  166.   PROCEDURE coth(x : REAL) : REAL;
  167.   VAR
  168.     Rueck : REAL;
  169.   BEGIN
  170.     Rueck := 1.0 / tanh(x);
  171.     RETURN Rueck;
  172.   END coth;
  173.  
  174.   PROCEDURE arsinh(x : REAL) : REAL;
  175.   VAR
  176.     Rueck : REAL;
  177.   BEGIN
  178.     Rueck := ln(x + sqrt(power(x, 2.0) + 1.0));
  179.     RETURN Rueck;
  180.   END arsinh;
  181.  
  182.   PROCEDURE arcosh(x : REAL) : REAL;
  183.   VAR
  184.     Rueck : REAL;
  185.   BEGIN
  186.     Rueck := ln(x + sqrt(power(x, 2.0) - 1.0));
  187.     RETURN Rueck;
  188.   END arcosh;
  189.  
  190.   PROCEDURE artanh(x : REAL) : REAL;
  191.   VAR
  192.     Rueck : REAL;
  193.   BEGIN
  194.     Rueck := 0.5 * ln((1.0 + x) / (1.0 -x));
  195.     RETURN Rueck;
  196.   END artanh;
  197.  
  198.   PROCEDURE arcoth(x : REAL) : REAL;
  199.   VAR
  200.     Rueck : REAL;
  201.   BEGIN
  202.     Rueck := 0.5 * ln((x + 1.0) / (x - 1.0));
  203.     RETURN Rueck;
  204.   END arcoth;
  205.  
  206.   PROCEDURE log(x : REAL) : REAL;
  207.   VAR
  208.     Rueck : REAL;
  209.   BEGIN
  210.     Rueck := ln(x) / ln(10.0);
  211.     RETURN Rueck;
  212.   END log;
  213.  
  214.   PROCEDURE logb(b, x : REAL) : REAL;
  215.   VAR
  216.     Rueck : REAL;
  217.   BEGIN
  218.     Rueck := ln(x) / ln(b);
  219.     RETURN Rueck;
  220.   END logb;
  221.  
  222. BEGIN
  223. END Mathe0.
  224. (* ------------------------------------------------------ *)
  225. (*                 Ende von MATHE0.MOD                    *)
  226.