home *** CD-ROM | disk | FTP | other *** search
- (****************************************************************************)
- (* MATHFUNC.PAS *)
- (* Version 1.1 *)
- (* 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) *)
- (* *)
- (* Modifikationen gegenueber der in PASCAL 3/87 veroeffentlichten Version: *)
- (* Fehlerkorrektur: x_hoch_y, arcosh *)
- (* Verbesserungen : sinh, cosh, tanh *)
- (* Erweiterungen : Fehlerbehandlung in Verbindung mit der Fehlerprozedur *)
- (* 'CalcError' des math. Ausdruckauswerters in PASCAL *)
- (* 6/87, "CALC - ein mathematischer Compiler". *)
- (****************************************************************************)
-
- (* 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 *)
-
- (*****************************************************************************)
- (* Das Vorzeichen von x ermitteln *)
-
-
- FUNCTION Sign(x : REAL) : INTEGER;
-
- BEGIN
- If x > 0.0 THEN sign := 1
- ELSE if x = 0.0 THEN sign := 0
- ELSE Sign := -1
- END;
-
- (****************************************************************************)
- (* 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 Vielfaches von 'n1' und 'n2' ermitteln: *)
-
- FUNCTION kgV (n1, n2: INTEGER): INTEGER;
-
- VAR n: INTEGER;
-
- BEGIN
- n := ggT(n1, n2);
- IF n <> 0 THEN
- kgV := (n1 DIV ggT(n1, n2)) * n2 (* kgv(n1,n2) := n1 * n2 / ggT(n1,n2 *)
- ELSE
- kgV := 0
- 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 (* n! ist fuer n < 0 nicht definiert *)
- CalcError(3, 'Fakultaet(x)')
- ELSE
- BEGIN
- 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;
- END;
-
- (****************************************************************************)
-
- FUNCTION Kehrwert (x: REAL): REAL;
-
- BEGIN
- IF x <> 0 THEN
- Kehrwert := 1 / x
- ELSE
- CalcError(3, 'in Kehrwert(x): x = 0')
- END;
-
- (****************************************************************************)
- (* Logarithmus von 'x' zur Basis 'b': *)
-
- FUNCTION Logarithmus (x, b: REAL): REAL;
-
- BEGIN
- IF (x > 0.0) AND (b <> 1.0) AND (b > 0.0) THEN
- Logarithmus := Ln(x) / Ln(b)
- ELSE
- CalcError(3, 'Logarithmus(x,b): x <= 0 oder b <= 0 oder b = 1')
- END;
-
- (****************************************************************************)
- (* Zehner-Logarithmus von 'x': *)
-
- FUNCTION lg (x: REAL): REAL;
-
- CONST rez_ln_10 = 0.434294481; (* rez_ln_10 = 1 / ln(10) *)
-
- BEGIN
- IF x > 0.0 THEN
- lg := Ln(x) * rez_ln_10
- ELSE
- CalcError(3, 'lg(x): x <= 0')
- END;
-
- (****************************************************************************)
- (* Zweier-Logarithmus von 'x': *)
-
- FUNCTION ld (x: REAL): REAL;
-
- CONST rez_ln_2 = 1.442695041; (* rez_ln_2 = 1 / ln(2) *)
-
- BEGIN
- IF x > 0.0 THEN
- ld := Ln(x) * rez_ln_2
- ELSE
- CalcError(3, 'ld(x): x <= 0')
- END;
-
- (****************************************************************************)
- (* Berechnung von 'x hoch y': *)
-
- FUNCTION x_hoch_y (x, y: REAL): REAL;
-
- VAR ganz_y: INTEGER;
-
- BEGIN
- IF (x <> 0.0) OR (y <> 0.0) THEN
- IF x > 0.0 THEN
- if abs(y*ln(abs(x))) > 86.0 THEN
- CalcError(3,'x_hoch_y(x,y): ABS(y*ln(X)) > 86.0')
- else x_hoch_y := Exp(y * Ln(x))
- ELSE
- BEGIN
- ganz_y := Trunc(y);
- IF ABS(y) > ABS(ganz_y) THEN
- CalcError(3, 'x_hoch_y(x,y): nur ganzzahlige Exponenten zulaessig')
- ELSE
- IF x <> 0.0 THEN
- IF (ganz_y MOD 2) = 0 THEN
- if abs(y*ln(abs(x))) > 86.0 THEN
- CalcError(3,'x_hoch_y(x,y): ABS(y*ln(X)) > 86.0')
- else x_hoch_y := Exp(Ln(ABS(x)) * y)
- ELSE
- if abs(y*ln(abs(x))) > 86.0 THEN
- CalcError(3,'x_hoch_y(x,y): ABS(y*ln(X)) > 86.0')
- else x_hoch_y := -Exp(Ln(ABS(x)) * y) (* ungerader Exponent *)
- ELSE
- x_hoch_y := 0
- END
- ELSE
- x_hoch_y := 1.0
- END;
-
- (****************************************************************************)
-
- (* Sinus hyp.: *)
-
- FUNCTION sinh (x: REAL): REAL;
-
- BEGIN
- x := Exp(x);
- sinh := 0.5 * (x-1/x);
- END;
-
- (* Cosinus hyp.: *)
-
- FUNCTION cosh (x: REAL): REAL;
-
- BEGIN
- x := Exp(x);
- cosh := 0.5 * (x+1/x);
- END;
-
- (* Tangens hyp.: *)
-
- FUNCTION tanh (x: REAL): REAL;
-
- BEGIN
- tanh := 1-2/(1+Exp(2*x));
- END;
-
- (* Cotangens hyp.: *)
-
- FUNCTION coth (x: REAL): REAL;
-
- BEGIN
- 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 x < 1.0 THEN
- CalcError(3, 'arcosh(x): x < 1')
- ELSE
- arcosh := Ln(x + Sqrt(Sqr(x) - 1));
- END;
-
- (* Umkehrfunktion zu tanh(x): *)
-
- FUNCTION artanh (x: REAL): REAL;
-
- BEGIN
- IF ABS(x) < 1.0 THEN
- artanh := 0.5 * Ln((1 + x) / (1 - x))
- ELSE
- CalcError(3, 'artanh(x): x <= -1 oder x >= 1')
- END;
-
- (* Umkehrfunktion zu coth(x): *)
-
- FUNCTION arcoth (x: REAL): REAL;
-
- BEGIN
- IF ABS(x) > 1.0 THEN
- arcoth := 0.5 * Ln((x + 1) / (x - 1))
- ELSE
- CalcError(3, 'arcoth(x): -1 <= x <= 1')
- END;
-
- (****************************************************************************)
-
- (* Tangens von 'x': *)
-
- FUNCTION tan (x: REAL): REAL;
-
- BEGIN
- IF Cos(x) <> 0 THEN
- tan := Sin(x) * Kehrwert(Cos(x))
- ELSE
- CalcError(3, 'tan(x): x = (Pi/2)')
- END;
-
- (* Cotangens von 'x': *)
-
- FUNCTION cot (x: REAL): REAL;
-
- VAR tmp: REAL;
-
- BEGIN
- tmp := Int(x/Pi_Halbe);
- IF tmp * Pi_Halbe <> x THEN
- cot := Kehrwert(tan(x))
- ELSE
- CalcError(3, 'cot(x): x = Vielfaches von Pi/2')
- END;
-
- (****************************************************************************)
-
- (* Umkehrfunktion zu sin(x): *)
-
- FUNCTION arcsin (x: REAL): REAL;
-
- BEGIN
- IF ABS(x) > 1.0 THEN
- CalcError(3, 'arcsin(x): x < -1 oder x > 1')
- ELSE
- IF ABS(x) < 1.0 THEN
- arcsin := ArcTan(x / Sqrt(1 - Sqr(x)))
- ELSE
- arcsin := x * Pi_Halbe
- END;
-
- (* Umkehrfunktion zu cos(x): *)
-
- FUNCTION arccos (x: REAL): REAL;
-
- BEGIN
- IF ABS(x) > 1.0 THEN
- CalcError(3, 'arccos(x): x < -1 oder x > 1')
- ELSE
- 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 *)