Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2009, 14:49   #21
arcman
 
Регистрация: 05.03.2009
Сообщений: 5
Стрелка

накидал свой костыль на эту тему
Код:
function pow(x: real; n: real): real;
var
n_int: integer;
begin
     if (ABS(2.0 - n) < 1E-9) then
     begin
          pow:= x * x;
          exit;
     end;

     if (ABS(3.0 - n) < 1E-9) then
     begin
          pow:= x * x * x;
          exit;
     end;

     if (x > 0) then
     begin
         pow:= EXP(LN(x) * n);
         exit;
     end;

     n_int := round(n);
     if (ABS(n_int - n) > 1E-9) then
     begin
          pow:= 0;
          writeln('#ERR# pow()');
          exit;
     end;

     (*if ((n_int MOD 2) = 0) then*)
     if ((n_int AND 1) = 0) then
     begin
          pow:= EXP(LN(ABS(x)) * n);
     end
     else
     begin
          pow:= (-1) * EXP(LN(ABS(x)) * n);
     end;
end;
arcman вне форума Ответить с цитированием
Старый 07.03.2009, 09:32   #22
ALEKSEEV-1992
Новичок
Джуниор
 
Регистрация: 26.02.2009
Сообщений: 1
По умолчанию

ой-йё зачем всё так усложнять?
Power(x,y);
x:=Число
y:=Степень
ALEKSEEV-1992 вне форума Ответить с цитированием
Старый 07.03.2009, 10:00   #23
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
ой-йё зачем всё так усложнять?
Если такой умный, набери это в Турбо Паскаль и посмотри что будет, в следующий раз выеживаться не будешь.
puporev вне форума Ответить с цитированием
Старый 07.03.2009, 15:46   #24
arcman
 
Регистрация: 05.03.2009
Сообщений: 5
По умолчанию

угу, в турбо паскаль отлаживал, а писал вот для этого:
http://ru.wikipedia.org/wiki/Structured_Text

так что в контроллерах где не поддерживается Си, всё достаточно плачевно.
с этим ST намучался уже.
arcman вне форума Ответить с цитированием
Старый 07.03.2009, 22:15   #25
Fellics{новичок}
Форумчанин
 
Аватар для Fellics{новичок}
 
Регистрация: 25.03.2008
Сообщений: 159
По умолчанию

Сорри не туда написал

Последний раз редактировалось Fellics{новичок}; 07.03.2009 в 22:16. Причина: нетуда написал
Fellics{новичок} вне форума Ответить с цитированием
Старый 29.03.2009, 11:35   #26
tmogoreanu
Новичок
Джуниор
 
Регистрация: 02.06.2008
Сообщений: 2
По умолчанию

Вот модуль pow.tpu pow.rar там содержится функция power(a,b).
Т.о
Uses pow;
...
begin
...
y:=power(2,3);
...
end.
tmogoreanu вне форума Ответить с цитированием
Старый 30.03.2009, 13:30   #27
tmogoreanu
Новичок
Джуниор
 
Регистрация: 02.06.2008
Сообщений: 2
По умолчанию

_____________________________

Последний раз редактировалось tmogoreanu; 30.03.2009 в 13:34.
tmogoreanu вне форума Ответить с цитированием
Старый 30.03.2009, 14:54   #28
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

exp(ln(x)*n)
где x - основание;
n - степень;
x,n должно быть типа real;
Ужас, как я устал от тупизны...
rainbow вне форума Ответить с цитированием
Старый 30.03.2009, 15:34   #29
arcman
 
Регистрация: 05.03.2009
Сообщений: 5
По умолчанию

Смею напомнить, что требуется реализация ф-и возведения в произвольную степень.

Она должна быть:
1) Правильно работающая
2) Написана на Паскале (максимально совместима/переносима)
arcman вне форума Ответить с цитированием
Старый 30.03.2009, 16:05   #30
arcman
 
Регистрация: 05.03.2009
Сообщений: 5
По умолчанию

я пока оставил так:
Код:
function pow(x: real; n: real): real;
var
n_int: integer;
begin
     if (x > 0) then
     begin
         pow:= EXP(LN(x) * n);
         exit;
     end;

     if (ABS(0.0 - x) < 1E-9) then
     begin
          pow:= 0.0;
          exit;
     end;

     n_int := round(n);
     if (ABS(n_int - n) > 1E-9) then
     begin
          pow:= 0;
          writeln('#ERR# pow()');
          exit;
     end;

     (*if ((n_int MOD 2) = 0) then*)
     if ((n_int AND 1) = 0) then
     begin
          pow:= EXP(LN(ABS(x)) * n);
     end
     else
     begin
          pow:= (-1) * EXP(LN(ABS(x)) * n);
     end;
end;
заместо 1E-9 лучше найти способ подставлять точное значение машинного эпсилон, но в моем случае хватает этого.

(простой пример высчитывающий примерное значение эпсилон, в среде TP 7.1, выдает 4.5474735089E-13 в режиме эмуляции сопроцессора и 5.42101086242752E-0020 в противном случае)

Заместо этого
Код:
          pow:= 0;
          writeln('#ERR# pow()');
неплохо было бы вернуть NaN, но я пока не знаю как сделать это на Паскаль (мне и не требуется)

в начало можно добавить пару оптимизаций, что бы зазря не гонять тяжелые ф-и ln() и exp()
Код:
     if (ABS(0.0 - n) < 1E-9) then
     begin
          pow:= 1.0;
          exit;
     end;

     if (ABS(1.0 - n) < 1E-9) then
     begin
          pow:= x;
          exit;
     end;

     if (ABS(2.0 - n) < 1E-9) then
     begin
          pow:= x * x;
          exit;
     end;

     if (ABS(3.0 - n) < 1E-9) then
     begin
          pow:= x * x * x;
          exit;
     end;
arcman вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возведение числа в степень Roberto Помощь студентам 9 05.04.2008 09:50
Возведение в степень Stanislav Общие вопросы Delphi 10 05.12.2007 23:34
Возведение в степень... Sota Общие вопросы C/C++ 7 18.07.2007 17:05
Задачи по массивам + возведение действительного числа в действительную степень springgirl Помощь студентам 2 24.04.2007 03:26
Delphi Возведение в степень Luska Помощь студентам 6 23.04.2007 17:51