Про PASCAL DOS'овский.
3140
11
Люди! Хееееееееееелп.

Тут мне брат попросил помочь сделать одну просто смешную прогу на Паскале еще досовском. Я никогда не был с этим связан. Первый раз сел, сделал все, только ЭТО не смог.

Как называется степенная функция???
Не охота второй FOR применять. Не поверят, что сам сделал.
давно это было, но возвести число в степень кажися было POW(x,y)... али нет?
=SmasH=
Я вообще с этим не имел дела.

Нет что-то я там во встроенном Хелповнике не нахожу такого...
Эхх, кажись нету там ее (а может я просто не помню), но сделать это через натуральный логарифм можно. Посмотри справочник по математике.
pow функции в Паскале нет... Но как уже предложили, используют обходной путь - логарифм, учитывая положительность аргуметов..
Если лень искать в справочнике по математике, то :
exp(x*ln(y)) - возвращает y в степени x..

P.S. Забавно, минуть 5 назад узнал что на нгсе появился форум по программированию :)) Может хоть тут толковые люди будут.. А то в Нске не знаю ни одного нормального форума по сабжу :((
SibProgrammer
Вот только вычисляться это будет долго... Если этих вычислений много и делаются они в цикле, то лучше руками написать функцию, которая будет делать последовательное умножение - намного быстрее получится.
SibProgrammer
Пасибо.

Re:P.S.
Люди то есть. Я! Только я ничего (почти) не знаю, но хочу научиться...
Тута паскаля у меня немае, но, как мне помнится смутно, была функция 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
-------
Объявление в зоопарке: "Страусов не пугать. Пол бетонный."
Full
Ассемблер оно, конечно, хорошо, а если степень дробная ???
Ну так опять в исходники лезем, и читаем, как это сделано :))

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)
Full
А если степень целая, но офигенно большая? То перемножение займет много времени. Надо или оптимизировать перемножение, или сразу к экспонированию логарифма переходить.

Если не ошибаюсь в Turbo Professional это должно быть, хотя это уже не интересно:(
Юра
Ну в таком разе можно попробовать переводить все к двоичному логарифму, тогда его возведение в степень является простой битовой операцией и будет ну оо-чень быстрой.
Но я не думаю, что сие потребуется обыкновенному человеку, а в специализированных мат. расчетах используются вещи, прошедшие через оптимизацию.

---
Full http://full.nm.ru
-------
Однажды в студеную зимнюю пору смотрю - поднимается медленно.