Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.28;
Скачать: CL | DM;

Вниз

Возведение в степень - что быстрее?   Найти похожие ветки 

 
Xenus   (2008-10-27 18:32) [0]

Есть два целых числа. Нужно возвести их в степень.

X, Y

Что быстрее:

IntPower(X, Y);
или
Exp(X * ln(Y)) ?
Или может еще есть функции из стандартных?

Чтобы не рыться вот исходные коды обоих функций.

function Exp(X: Real): Real; System.pas  :
procedure       _EXP;  
asm
       {       e**x = 2**(x*log2(e))   }

       FLDL2E              { y := x*log2e;      }
       FMUL
       FLD     ST(0)       { i := round(y);     }
       FRNDINT
       FSUB    ST(1), ST   { f := y - i;        }
       FXCH    ST(1)       { z := 2**f          }
       F2XM1
       FLD1
       FADD
       FSCALE              { result := z * 2**i }
       FSTP    ST(1)
end;


(+ ln)

function IntPower(const Base: Extended; const 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;


 
Jeer ©   (2008-10-27 18:40) [1]

Так проверь, потом доложишь.


 
БарЛог ©   (2008-10-27 19:37) [2]

IntPower
ИМХО


 
TUser ©   (2008-10-27 20:17) [3]

А вот все эти FADD и FSCALE за один таккт все выполняются, за такое же время, как xor? Что-то подозревается, что это от процессора зависит.

Ламерское мнение, правда.


 
БарЛог ©   (2008-10-27 20:34) [4]

> А вот все эти FADD и FSCALE за один таккт все выполняются, за такое же время, как xor? Что-то подозревается, что это от процессора зависит.

Ну... тип процессора в сабже не уточняется :) Может, там 386.


 
Anatoly Podgoretsky ©   (2008-10-27 21:11) [5]

> TUser  (27.10.2008 20:17:03)  [3]

Не так, на современных процессорах за такт выполняется несколько операций, до CORE 2 было 5, с CORE 2 чуть поменьше.


 
TUser ©   (2008-10-27 21:16) [6]

Ну вот xor"ов и этой экзотики одинаковое число за так пройдет? Что-то мне подсказывает, что нет, и даже не стандартизовано. А значит - зависит от типа проца, хъотя бы теоретически.


 
Омлет   (2008-10-27 23:03) [7]

1. Смотри http://www.rsdn.ru/article/alg/fastpow.xml

2. Еще один, чисто академический вариант ;)


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;


 
Xenus   (2008-10-28 00:29) [8]


> Омлет   (27.10.08 23:03) [7]


Да но хотелось бы по факту стандартных функций.

У автора статьтьи очень похож код на
код функции
function Exp(X: Real): Real; System.pas  :
(procedure       _EXP; )
в первом варианте кода в статьте.

Т.е. получаем что вариант Exp( X * ln(Y) ) быстрее чем IntPower(X, Y)
на современных процессорах?


 
Xenus   (2008-10-28 00:29) [9]


> У автора статьтьи очень похож код на
> код функции


Практически один в один.


 
Xenus   (2008-10-28 00:30) [10]


> У автора статьтьи очень похож код на
> код функции


Практически один в один.

А такой вопрос паралльельно - есть ли функция возводящая двойку в целую степень?


 
Xenus   (2008-10-28 00:37) [11]

И еще я хотел спросить, не раз замечал в исходниках когда пишут так:

IntPower(1.0 + R, N)
вместо просто целого числа, без нуля. А зачем?


 
Юрий Зотов ©   (2008-10-28 04:09) [12]

> Xenus   (28.10.08 00:37) [11]

1 + R - сложение целого с вещественным. Тратится время на предварительное преобразование младшего типа к старшему.

1.0 + R сложение вещественного с вещественным. Преобразование не требуется.

Если компилятор умный, то он и в первом случае сгенерит вещественную (а не целую) константу. Но лучше на его ум не надеяться.


 
Омлет   (2008-10-28 07:22) [13]

> Xenus

Ты статью всю прочитай. Автор показал, что основание логарифма 2 дает большую точность и теоретически немного быстрее.

Возведение двойки в целую степень:  2^n = 1 shl n
умножение на степень двойки:  x*(2^n) = x shl n


 
Дуб ©   (2008-10-28 09:32) [14]

А вообще - Кнут, Глава 4. :) Там много отчудных ожидает.


 
isasa ©   (2008-10-28 13:51) [15]

Юрий Зотов ©   (28.10.08 04:09) [12]

Если компилятор умный,


:)

Не все такие умные :)

В Паскале и Дельфи
x:=1/3; x:=1.0/3.0; эквивалентны,
а в C и C++ можно так нарваться .... :)


 
@!!ex ©   (2008-10-29 19:46) [16]

> а в C и C++ можно так нарваться .... :)

Нарваться можно если не знать операторов С.
А не знаение операторов языка - это равносильно не знанию языка.
Не зная язык писать вообще нельзя.

P.S.
Каюсь, сам нарывался. :)
Но мнение от этого не меняется. Скорее научило, что надо читать стандарт, прежде чем лезть прогать.



Страницы: 1 вся ветка

Текущий архив: 2008.12.28;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
15-1225230195
Германн
2008-10-29 00:43
2008.12.28
Спам-боты


15-1225052523
koha!
2008-10-26 23:22
2008.12.28
Консоль для супер маленьких


15-1225263402
vajo
2008-10-29 09:56
2008.12.28
Категория прав D в США. Описание.


15-1225449397
Галинка
2008-10-31 13:36
2008.12.28
Как "починить" программку


2-1226946443
demon
2008-11-17 21:27
2008.12.28
Как получить полный путь к файлу из относительного?