Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
// EPowerException = class(Exception)
// end;
function Power(X, N : real) : extended;
const
beskonechnost=10000000.0;
var
t:longint;
r:real;
isInteger:boolean;
begin
if N = 0 then
begin
result := 1.0;
exit;
end;
if X = 1.0 then
begin
result := 1.0;
exit;
end;
if X = 0.0 then
begin
if N > 0.0 then
begin
result := 0.0;
exit;
end
else
begin
result := beskonechnost;
exit;
end
//raise EPowerException.Create('Результат - бесконечность');
end;
if (X > 0) then
try
result := exp(N * ln(X));
exit;
except
begin
if X<1.0 then result := 0.0 else result := beskonechnost;;
exit;
end
//raise EPowerException.Create('Результат - переполнение или потеря значимости');
end;
// X - отрицательный, но мы все еще можем вычислить результат, если n целое.
// пытаемся получить целую часть n с использованием типа longint, вычисление
// четности n не займет много времени
t:=0; //???
try
t := trunc(n);
if (n - t) = 0 then isInteger := true
else isInteger := False;
except
// Лишний бит может вызвать переполнение или потерю значимости
r := int(n);
if (n - r) = 0 then
begin
isInteger := true;
if frac(r/2) = 0.5 then t := 1 else t := 2;
end
else isInteger := False;
end;
if isInteger then
begin
//n целое
if odd(t) then
//n нечетное
try
result := -exp(N * ln(-X));
exit;
except
//raise EPowerException.Create('Результат - переполнение или потеря значимости');
begin
result := 0.0;
exit;
end
end
else
//n четное
try
result := exp(N * ln(-X));
exit;
except
//raise EPowerException.Create('Результат - переполнение или потеря значимости');
begin
result := 0.0;
exit;
end
end;
end
else
//raise EPowerException.Create('Результат невычисляем');
begin
result := 0.0;
exit;
end
end;
Составить ответ | Вернуться на конференцию
Ответы