home *** CD-ROM | disk | FTP | other *** search
- (****************************************************************************)
- (* MATHFUNC.PAS *)
- (* Formulierung einiger nuetzlicher mathematischer Funktionen und *)
- (* Konstanten. Dabei werden folgende Standardfunktionen vorausgesetzt: *)
- (* Sin(x), Cos(x), Exp(x), ArcTan(x), Ln(x), Sqrt(x), Sqr(x) *)
- (* *)
- (****************************************************************************)
-
- (* folgende Konstanten je nach Compiler in globalen Vereinbarungsteil ueber-
- nehmen ! *)
-
- CONST Wurzel_2 = 1.414213562;
- Pi = 3.141592654;
- E = 2.718281829;
- Pi_Halbe = 1.570796327; (* Pi_Halbe = Pi/2 *)
-
- (****************************************************************************)
- (* groessten, gemeinsamen Teiler von 'n1' und 'n2' ermitteln: *)
-
- FUNCTION ggT (n1, n2: INTEGER): INTEGER;
-
- BEGIN
- n1 := ABS(n1); (* Berechnung erfolgt nach dem Euklid'schen Algorithmus *)
- n2 := ABS(n2);
- IF (n1 <> 0) AND (n2 <> 0) THEN (* ggT(0,0) := 0 *)
- IF n2 <> 0 THEN (* Teilung durch Null ist unzulaessig *)
- REPEAT
- n1 := (n1 MOD n2);
- IF n1 > 0 THEN
- n2 := (n2 MOD n1);
- UNTIL (n1 = 0) OR (n2 = 0);
- ggT := n1 + n2;
- END;
-
- (****************************************************************************)
- (* kleinstes, gemeinsames Vilefaches von 'n1' und 'n2' ermitteln: *)
-
- FUNCTION kgV (n1, n2: INTEGER): INTEGER;
-
- BEGIN
- kgV := (n1 DIV ggT(n1, n2)) * n2 (* kgv(n1,n2) := n1 * n2 / ggT(n1,n2 *)
- END;
-
- (****************************************************************************)
- (* Bogenmass nach Altgrad umrechnen: *)
-
- FUNCTION altgrad (x: REAL): REAL;
-
- CONST k_180_durch_Pi = 57.29577951; (* k_180_durch_pi = 180 / Pi *)
-
- BEGIN
- altgrad := x * k_180_durch_Pi;
- END;
-
- (****************************************************************************)
- (* Altgrad nach Bogenmass umrechnen: *)
-
- FUNCTION radiant (alpha: REAL): REAL;
-
- CONST Pi_durch_180 = 0.017453292; (* Pi_durch_180 = Pi / 180 *)
-
- BEGIN
- radiant := alpha * Pi_durch_180;
- END;
-
- (****************************************************************************)
- (* is' klar !? *)
-
- FUNCTION fakultaet (n: INTEGER): REAL;
-
- CONST fak_00 = 1.000000000E00; (* fak_00 = 0! *)
- fak_08 = 4.032000000E04; (* fak_08 = 8! *)
- fak_16 = 2.092278989E13; (* fak_16 = 16! *)
- fak_24 = 6.204484016E23; (* fak_24 = 24! *)
- fak_32 = 2.631308368E35; (* fak_32 = 32! *)
-
- VAR i, d: INTEGER;
- r : REAL;
-
- BEGIN
- IF n < 0 THEN
- HALT; (* n! ist fuer n < 0 nicht definiert *)
- d := (n DIV 8);
- CASE d OF (* dieser kleine Trick dient zur Beschleunigung *)
- 0 : r := 1.00;
- 1 : r := fak_08;
- 2 : r := fak_16;
- 3 : r := fak_24;
- 4 : r := fak_32;
- END;
- IF (d * 8 < n) THEN
- FOR i := d * 8 + 1 TO n DO
- r := r * i;
- fakultaet := r;
- END;
-
- (****************************************************************************)
-
- FUNCTION kehrwert (x: REAL): REAL;
-
- BEGIN
- IF X = 0 THEN (* Division durch Null ist nicht definiert ! *)
- HALT; (* -> Programm-Abbruch !! *)
- kehrwert := 1 / x;
- END;
-
- (****************************************************************************)
- (* Logarithmus von 'x' zur Basis 'b': *)
-
- FUNCTION logarithmus (x, b: REAL): REAL;
-
- BEGIN
- IF b = 1 THEN
- HALT; (* Logarithmus zur Basis 1 ist nich definiert! *)
- logarithmus := ln(x) / ln(b);
- END;
-
- (****************************************************************************)
- (* Zehner-Logarithmus von 'x': *)
-
- FUNCTION lg (x: REAL): REAL;
-
- CONST rez_ln_10 = 0.434294481; (* rez_ln_10 = 1 / ln(10) *)
-
- BEGIN
- lg := ln(x) * rez_ln_10;
- END;
-
- (****************************************************************************)
- (* Zweier-Logarithmus von 'x': *)
-
- FUNCTION ld (x: REAL): REAL;
-
- CONST rez_ln_2 = 1.442695041; (* rez_ln_2 = 1 / ln(2) *)
-
- BEGIN
- ld := ln(x) * rez_ln_2;
- END;
-
- (****************************************************************************)
- (* Berechnung von 'x hoch y': *)
-
- FUNCTION x_hoch_y (x, y: REAL): REAL;
-
- VAR ganz_y: INTEGER;
-
- BEGIN
- IF (x = 0) AND (y = 0) THEN
- HALT; (* "0 hoch 0" und Teilung durch Null unzul. *)
- IF x < 0 THEN
- BEGIN
- ganz_y := TRUNC(y);
- IF y > ganz_y THEN
- HALT (* nur ganzzahlige Exponenten zulaessig *)
- ELSE
- IF (ganz_y MOD 2) = 0 THEN
- x_hoch_y := Exp(Ln(ABS(x)) * y)
- ELSE
- x_hoch_y := -Exp(Ln(ABS(x)) * y) (* ungerader Exponent *)
- END
- ELSE
- x_hoch_y := EXP(y * Ln(x));
- END;
-
- (****************************************************************************)
-
- (* Sinus hyp.: *)
-
- FUNCTION sinh (x: REAL): REAL;
-
- BEGIN
- sinh := 0.5 * (Exp(x) - Exp(-x));
- END;
-
- (* Cosinus hyp.: *)
-
- FUNCTION cosh (x: REAL): REAL;
-
- BEGIN
- cosh := 0.5 * (Exp(x) + Exp(-x));
- END;
-
- (* Tangens hyp.: *)
-
- FUNCTION tanh (x: REAL): REAL;
-
- BEGIN
- tanh := sinh(x) / cosh(x);
- END;
-
- (* Cotangens hyp.: *)
-
- FUNCTION coth (x: REAL): REAL;
-
- BEGIN
- IF x = 0 THEN
- HALT; (* bei x = 0 ist coth(x) nicht definiert *)
- coth := 1 / tanh(x);
- END;
-
- (****************************************************************************)
-
- (* Umkehrfunktion zu sinh(x): *)
-
- FUNCTION arsinh (x: REAL): REAL;
-
- BEGIN
- arsinh := ln(x + Sqrt(Sqr(x) + 1));
- END;
-
- (* Umkehrfunktion zu cosh(x): *)
-
- FUNCTION arcosh (x: REAL): REAL;
-
- BEGIN
- IF ABS(x) < 1 THEN
- HALT; (* fuer -1 < x < 1 ist arcosh(x) nicht definiert *)
- arcosh := Ln(x + Sqrt(Sqr(x) - 1));
- END;
-
- (* Umkehrfunktion zu tanh(x): *)
-
- FUNCTION artanh (x: REAL): REAL;
-
- BEGIN
- IF ABS(x) >= 1 THEN
- HALT; (* fuer x <= -1 v x >= 1 ist artanh(x) nicht definiert *)
- artanh := 0.5 * Ln((1 + x) / (1 - x));
- END;
-
- (* Umkehrfunktion zu coth(x): *)
-
- FUNCTION arcoth (x: REAL): REAL;
-
- BEGIN
- IF ABS(x) <= 1 THEN
- HALT; (* fuer -1 <= x <= 1 ist arcoth(x) nicht definiert *)
- arcoth := 0.5 * Ln((x + 1) / (x - 1));
- END;
-
- (****************************************************************************)
-
- (* Tangens von 'x': *)
-
- FUNCTION tan (x: REAL): REAL;
-
- BEGIN
- tan := sin(x) * kehrwert(cos(x)) (* evtl. Division durch Null abfangen *)
- END;
-
- (* Cotangens von 'x': *)
-
- FUNCTION cot (x: REAL): REAL;
-
- BEGIN
- cot := kehrwert(tan(x)); (* evtl. Division durch Null abfangen *)
- END;
-
- (****************************************************************************)
-
- (* Umkehrfunktion zu sin(x): *)
-
- FUNCTION arcsin (x: REAL): REAL;
-
- BEGIN
- IF ABS(x) > 1 THEN
- HALT; (* fuer x < -1 v x > 1 ist arcsin(x) nicht definiert *)
- IF ABS(X) = 1 THEN
- arcsin := x * Pi_halbe
- ELSE
- arcsin := arctan(x / Sqrt(1 - Sqr(x)));
- END;
-
- (* Umkehrfunktion zu cos(x): *)
-
- FUNCTION arccos (x: REAL): REAL;
-
- BEGIN
- arccos := Pi_halbe - arcsin(x);
- END;
-
- (* Umkehrfunktion zu cot(x): *)
-
- FUNCTION arccot (X: REAL): REAL;
-
- BEGIN
- arccot := Pi_halbe - arctan(x);
- END;
-
- (****************************************************************************)
- (* Ende von MATHFUNC.PAS *)