home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
sonderh1
/
mathfunc.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1987-02-03
|
9KB
|
291 lines
(****************************************************************************)
(* 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 *)