Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.175] |
|
Сообщ.
#1
,
|
|
|
Разберём несколько способов возведения числа в степень.
1й способ. «Лобовой». В цикле, n раз увеличиваем переменную «р» в Х (основание степени) раз. function step(x:real;n:integer):real; var i:integer; p:real; begin p:=1; if n=0 then step:=1; if n>0 then for i:=1 to abs(n) do p:=p*x; if n<0 then for i:=1 to abs(n) do p:=p/x; step:=p end; 2й способ. Рекурсивный. Будет отнимать много памяти при больших степенях. function Step(X:real;N:integer):real; begin if N=0 then Step:=1 else if N<0 then Step:=1/Step(X,-N) else Step:=X*Step(X,N-1); end; 3й способ. Наверное самый удобный. Из математики известно: если x=a^b, то x=Exp(b*ln(a)) function step(x,k:real):real; begin step:=Exp(k*ln(x)); end; |
Сообщ.
#2
,
|
|
|
Да. Хотелось бы теперь увидеть все типы ограничений при возведении последним способом
Например чтобы нормально работали варианты "-1^0.5" (корень квадратный из отр. числа) не хотелось бы чтобы программа вылетала с ошибкой. Или корень любой степени из нуля. |
Сообщ.
#3
,
|
|
|
Ну не сёвый же код сюда постить...
Насчет ограничений - там всего одно: a>0 и все. И не возведешь ты так -1 в степень 1/3 Для дробных степеней надо вот так: function fracstep(x:real;m,n:integer):real; var pr:real; i:integer; begin if n=0 then begin writeln('Error calling fracstep: divisor of power is 0'); fracstep:=1; exit end; if n<0 then begin m:=-m; n:=-n; end; if ((n-1) and 1>0) and (x<0) then begin writeln('Error calling fracstep, square root from negative number'); writeln('DEBUG: x=',x,',m=',m,',n=',n); fracstep:=0; exit end; if (x=0) and (n>1) then begin writeln('Error calling fracstep, cannot take a root from zero'); fracstep:=0; exit end; pr:=1; for i:=1 to m do pr:=pr*abs(x); pr:=exp(1/n*ln(pr)); if (x<0) and ((m and 1)>0) then pr:=-pr; fracstep:=pr; end; |