Алгоритм быстрой инверсии медленнее, чем функция math.h 1/sqrt
Я просто хочу узнать, почему алгоритм быстрой инверсии медленнее, чем функция math.h sqrt. Вот мой пример кода
Код пытается продемонстрировать сравнение медленной и быстрой инверсий. Во время отладки я вижу 1 секунду для медленной инверсии и 4 секунды для быстрой инверсии. В чем проблема?
#include<stdio.h>
#include<time.h>
#include<math.h>
#include"inverse.h"
#define SIZE 256
int main()
{
char buffer[SIZE];
time_t curtime;
time_t curtime2;
struct tm *loctime;
int i = 0;
float x = 0;
curtime = time(NULL);
loctime = localtime (&curtime);
fputs (asctime (loctime), stdout);
while(i < 100000000)
{
i++;
//x = 1/sqrt(465464.015465);
x = inverse_square_root(465464.015465);
}
curtime = time(NULL);
loctime = localtime (&curtime);
fputs (asctime (loctime), stdout);
getchar();
return 0;
}
float inverse_square_root(float number)
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the heck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
return y;
}
3 ответа
"Проблема" может заключаться в том, что у вас есть оборудование, которое реализует sqrt()
Теперь, делая это быстрее, чем программный подход. Трудно сказать без каких-либо подробностей о вашей системе и, возможно, с некоторыми данными профилирования и разборки.
Посмотрите этот ответ для деталей о количестве циклов для x86 fsqrt
инструкция, например.
Вопреки этому вопросу, sqrt или обратный sqrt могли быть оптимизированы на уровне процессора.
Далее: тестировали ли вы код с наивысшим уровнем оптимизации?
Нечетная магическая константа использует представление 32-битной плавающей запятой IEEE, извлекая хорошее начальное приближение для итерации Ньютона.
Если вы действительно хотите продемонстрировать "медленный" против "быстрого", вам нужно знать, что делают оба алгоритма, поскольку нет особой причины думать, что sqrt() медленный. Напишите свою собственную функцию slow_sqrt.