LINUX.ORG.RU
Ответ на: комментарий от anonymous

тот, где операций умножения вида x*y ( где x и y неизвестные на этапе компиляции значения ) меньше

ukez
()

Зависит от компилятора и опций компиляции.

Под gcc 3.2  у меня получилось, что самый быстрый вариант 4*a*a+4*a+1

#include <stdio.h>
#include <time.h>

#define MAXI 1000000000

int main(void)
{
clock_t mem;
int i;
int a=2.0,b,c;

   mem=clock();
   for(i=0;i<MAXI; i++)
      b=4*a*a+4*a+1;
   printf("b=%d, t=%d\n",b,clock()-mem);
   mem=clock();
   for(i=0;i<MAXI; i++)
      b=(2*a+1)*(2*a+1);
   printf("b=%d, t=%d\n",b,clock()-mem);
   mem=clock();
   for(i=0;i<MAXI; i++){
      c=(2*a+1);
      b=c*c;
   }
   printf("b=%d, t=%d\n",b,clock()-mem);
   mem=clock();
   for(i=0;i<MAXI; i++){
      b=4*a*(a+1)+1;
   }
   printf("b=%d, t=%d\n",b,clock()-mem);

   return 0;
}

$gcc -O0 -o tryplustimes tryplustimes.c

$./tryplustimes
b=25, t=4410000
b=25, t=4990000
b=25, t=5010000
b=25, t=5320000

Die-Hard ★★★★★
()

Имхо b=a+1; c=a+b; d=c*c; , только -O2 надо поставить, а то еще стековые переменные создаст -- будет числа тягать в память и обратно! (или за gcc не водится?)

А вообще-то зависит от _процессора_, компилятора, настроек оптимизации...

Общий метод, конечно,

P(x) == a0 + x*(a1 + x*(a2 + x*(....)))

это если разложения на множители хорошего нет или замены переменных... (как в примере)

lodin ★★★★
()

Первое приближение:
++1 -- это инкремент, операция очень короткая.
4*а или 2*а это сдвиг влево на два или один бит, то есть операция короткая
Сложение тоже короткая операция.
Стало быть длинная операция это а*а или (...)*(...), а она единственная
в обоих вариантах.

Второе приближение:
а*а делает мат.сопроцессор, а остальное простой процессор, стало быть 
такую операцию надо начать выполнять первой, затем выполнить 4*a+1, а затем уже
закончить вычисление. 
Тогда сопроцессор будет работать параллельно с простым процессором.

Это все слова, если бы это делать на 8086, да на ассемблере, то да.

ansky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.