home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* X_HOCH_Y.PAS *)
- (* einfaches Berechnen von Potenzen *)
- (* (c) 1990 Michael Lauer & TOOLBOX *)
- (* ------------------------------------------------------ *)
- { txMath }
- FUNCTION x_hoch_y( x : REAL;
- y : DOUBLE;
- VAR ErrMsg : StringZeiger) : EXTENDED;
-
- CONST
- overflow : STRING = 'Überlauf bei Ausrechnung, ' +
- 'Werte sind zu klein/groß';
- exp_is_zero : STRING = 'Die Basis Null darf keine ' +
- 'Zahl kleiner/gleich Null ' +
- 'als Exponenten haben';
- minus_base : STRING = 'Eine negative Basis darf ' +
- 'keine Bruchzahl als ' +
- 'Exponenten haben';
- VAR
- changed_sign : BOOLEAN;
- help : DOUBLE;
- d_result : EXTENDED;
- BEGIN
- ErrMsg := NIL;
- changed_sign := x < 0;
- IF changed_sign THEN x := -x;
- IF x = 0 THEN BEGIN
- IF y <= 0 THEN
- ErrMsg := @exp_is_zero
- ELSE
- x_hoch_y := 0;
- { Sonderfall: bei X = 0 und Y > 0 ist X^Y = 0 }
- Exit;
- END;
- d_result := y * Ln(x);
- IF (d_result < -2838) OR (d_result > 2838) THEN BEGIN
- ErrMsg := @overflow;
- Exit;
- END;
- IF changed_sign AND (Abs(Frac(y)) < 1E-10) THEN BEGIN
- y := Trunc(y);
- IF Odd(Round(y)) THEN
- x_hoch_y := -(Exp(d_result))
- ELSE
- x_hoch_y := Exp(d_result);
- END ELSE
- IF NOT changed_sign THEN
- x_hoch_y := Exp(d_result)
- ELSE
- ErrMsg := @minus_base;
- END;
- (* ------------------------------------------------------ *)
- (* Ende von X_HOCH_Y.PAS *)