-
Есть два целых числа. Нужно возвести их в степень. X, Y Что быстрее: IntPower(X, Y); или Exp(X * ln(Y)) ? Или может еще есть функции из стандартных? Чтобы не рыться вот исходные коды обоих функций. function Exp(X: Real): Real; System.pas : procedure _EXP;
asm
FLDL2E
FMUL
FLD ST(0)
FRNDINT
FSUB ST(1), ST
FXCH ST(1)
F2XM1
FLD1
FADD
FSCALE
FSTP ST(1)
end; (+ ln) function IntPower(const Base: Extended; const Exponent: Integer): Extended;
asm
mov ecx, eax
cdq
fld1
xor eax, edx
sub eax, edx
jz @@3
fld Base
jmp @@2
@@1: fmul ST, ST
@@2: shr eax,1
jnc @@1
fmul ST(1),ST
jnz @@1
fstp st
cmp ecx, 0
jge @@3
fld1
fdivrp
@@3:
fwait
end;
-
Так проверь, потом доложишь.
-
IntPower ИМХО
-
А вот все эти FADD и FSCALE за один таккт все выполняются, за такое же время, как xor? Что-то подозревается, что это от процессора зависит.
Ламерское мнение, правда.
-
> А вот все эти FADD и FSCALE за один таккт все выполняются, за такое же время, как xor? Что-то подозревается, что это от процессора зависит.
Ну... тип процессора в сабже не уточняется :) Может, там 386.
-
> TUser (27.10.2008 20:17:03) [3]
Не так, на современных процессорах за такт выполняется несколько операций, до CORE 2 было 5, с CORE 2 чуть поменьше.
-
Ну вот xor'ов и этой экзотики одинаковое число за так пройдет? Что-то мне подсказывает, что нет, и даже не стандартизовано. А значит - зависит от типа проца, хъотя бы теоретически.
-
1. Смотри http://www.rsdn.ru/article/alg/fastpow.xml2. Еще один, чисто академический вариант ;)
function Pow(x, n: Integer): Integer;
var x1: Integer;
begin
if n = 0 then Result := 1
else begin
x1 := Pow(x, n shr 1);
Result := x1*x1;
if (n and 1 <> 0) then Result := Result*x;
end;
end;
-
> Омлет (27.10.08 23:03) [7]
Да но хотелось бы по факту стандартных функций.
У автора статьтьи очень похож код на код функции function Exp(X: Real): Real; System.pas : (procedure _EXP; ) в первом варианте кода в статьте.
Т.е. получаем что вариант Exp( X * ln(Y) ) быстрее чем IntPower(X, Y) на современных процессорах?
-
> У автора статьтьи очень похож код на > код функции
Практически один в один.
-
> У автора статьтьи очень похож код на > код функции
Практически один в один.
А такой вопрос паралльельно - есть ли функция возводящая двойку в целую степень?
-
И еще я хотел спросить, не раз замечал в исходниках когда пишут так:
IntPower(1.0 + R, N) вместо просто целого числа, без нуля. А зачем?
-
> Xenus (28.10.08 00:37) [11]
1 + R - сложение целого с вещественным. Тратится время на предварительное преобразование младшего типа к старшему.
1.0 + R сложение вещественного с вещественным. Преобразование не требуется.
Если компилятор умный, то он и в первом случае сгенерит вещественную (а не целую) константу. Но лучше на его ум не надеяться.
-
> Xenus
Ты статью всю прочитай. Автор показал, что основание логарифма 2 дает большую точность и теоретически немного быстрее.
Возведение двойки в целую степень: 2^n = 1 shl n умножение на степень двойки: x*(2^n) = x shl n
-
А вообще - Кнут, Глава 4. :) Там много отчудных ожидает.
-
Юрий Зотов © (28.10.08 04:09) [12]
Если компилятор умный,
:)
Не все такие умные :)
В Паскале и Дельфи x:=1/3; x:=1.0/3.0; эквивалентны, а в C и C++ можно так нарваться .... :)
-
> а в C и C++ можно так нарваться .... :)
Нарваться можно если не знать операторов С. А не знаение операторов языка - это равносильно не знанию языка. Не зная язык писать вообще нельзя.
P.S. Каюсь, сам нарывался. :) Но мнение от этого не меняется. Скорее научило, что надо читать стандарт, прежде чем лезть прогать.
|