На самом деле вопрос далеко не тривиальный. Проблема в том, что сам алгоритм функции далеко не прост. Функцией Power(X, N) (т.е. X^N) должны четко отслеживаться несколько возможных ситуаций:
interface type EPowerException = class(Exception)end; implementation function Power(X, N : real) : extended; var t : longint;r : real;isInteger : boolean;begin if N = 0 then beginresult := 1.0;exit;end; if X = 1.0 then beginresult := 1.0;exit;end; if X = 0.0 then beginif N > 0.0 thenbeginresult := 0.0;exit;endelseraise EPowerException.Create('Результат - бесконечность');end; if (X > 0) thentryresult := exp(N * ln(X));exit;exceptraise EPowerException.Create('Результат - переполнение или потеря значимости');end; { X - отрицательный, но мы все еще можем вычислить результат, если n целое. } { пытаемся получить целую часть n с использованием типа longint, вычисление } { четности n не займет много времени } tryt := trunc(n);if (n - t) = 0 thenisInteger := trueelseisInteger := False;except{ Лишний бит может вызвать переполнение или потерю значимости }r := int(n);if (n - r) = 0 thenbeginisInteger := true;if frac(r/2) = 0.5 thent := 1elset := 2;endelseisInteger := False;end; if isInteger thenbegin{n целое}if odd(t) then{n нечетное}tryresult := -exp(N * ln(-X));exit;exceptraise EPowerException.Create('Результат - переполнение или потеря значимости');endelse{n четное}tryresult := exp(N * ln(-X));exit;exceptraise EPowerException.Create('Результат - переполнение или потеря значимости');end;endelseraise EPowerException.Create('Результат невычисляем'); end; |
[000157]
X^Y = exp(ln(X) * Y) c некоторыми условиями (например, X не может быть нулем). [000495]