Тут мне брат попросил помочь сделать одну просто смешную прогу на Паскале еще досовском. Я никогда не был с этим связан. Первый раз сел, сделал все, только ЭТО не смог.
Как называется степенная функция???
Не охота второй FOR применять. Не поверят, что сам сделал.
pow функции в Паскале нет... Но как уже предложили, используют обходной путь - логарифм, учитывая положительность аргуметов..
Если лень искать в справочнике по математике, то :
exp(x*ln(y)) - возвращает y в степени x..
P.S. Забавно, минуть 5 назад узнал что на нгсе появился форум по программированию :)) Может хоть тут толковые люди будут.. А то в Нске не знаю ни одного нормального форума по сабжу :((
Вот только вычисляться это будет долго... Если этих вычислений много и делаются они в цикле, то лучше руками написать функцию, которая будет делать последовательное умножение - намного быстрее получится.
Тута паскаля у меня немае, но, как мне помнится смутно, была функция power
D3 точно уже такую имеет,
И по коду видно, что используется обыкновенное циклическое умножение, переписанное в асме.
{ Invariant: Y >= 0 & Result*X**Y = X**I. Init Y = I and Result = 1. }
{function IntPower(X: Extended; I: Integer): Extended;
var
Y: Integer;
begin
Y := Abs(I);
Result := 1.0;
while Y > 0 do begin
while not Odd(Y) do
begin
Y := Y shr 1;
X := X * X
end;
Dec(Y);
Result := Result * X
end;
if I < 0 then Result := 1.0 / Result
end;
}
function IntPower(Base: Extended; Exponent: Integer): Extended;
asm
mov ecx, eax
cdq
fld1 { Result := 1 }
xor eax, edx
sub eax, edx { eax := Abs(Exponent) }
jz @@3
fld Base
jmp @@2
@@1: fmul ST, ST { X := Base * Base }
@@2: shr eax,1
jnc @@1
fmul ST(1),ST { Result := Result * X }
jnz @@1
fstp st { pop X from FPU stack }
cmp ecx, 0
jge @@3
fld1
fdivrp { Result := 1 / Result }
@@3:
fwait
end;
---
Full http://full.nm.ru
-------
Объявление в зоопарке: "Страусов не пугать. Пол бетонный."
Ну так опять в исходники лезем, и читаем, как это сделано :))
function Power(Base, Exponent: Extended): Extended;
begin
if Exponent = 0.0 then
Result := 1.0 { n**0 = 1 }
else if (Base = 0.0) and (Exponent > 0.0) then
Result := 0.0 { 0**n = 0, n > 0 }
else if (Frac(Exponent) = 0.0) and (Abs(Exponent)
А если степень целая, но офигенно большая? То перемножение займет много времени. Надо или оптимизировать перемножение, или сразу к экспонированию логарифма переходить.
Если не ошибаюсь в Turbo Professional это должно быть, хотя это уже не интересно:(
Ну в таком разе можно попробовать переводить все к двоичному логарифму, тогда его возведение в степень является простой битовой операцией и будет ну оо-чень быстрой.
Но я не думаю, что сие потребуется обыкновенному человеку, а в специализированных мат. расчетах используются вещи, прошедшие через оптимизацию.
---
Full http://full.nm.ru
-------
Однажды в студеную зимнюю пору смотрю - поднимается медленно.
Информация о возрастных ограничениях в отношении информационной продукции, подлежащая распространению на основании норм Федерального закона «О защите детей от информации, причиняющей вред их здоровью и развитию».
Некоторые материалы настоящего раздела могут содержать информацию, запрещенную для детей.