Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

громоздкий, но универсальный вариант

Отправлено Vasily_A 17 февраля 2008 г. 10:57
В ответ на: Народ , может кто помнит как в Делфи в степень возвести. отправлено <font color=gray>smartleds</font> 17 февраля 2008 г. 03:16

// 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;


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 85:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru