December 22nd, 2009

Как быстрее всего приближенно вычислить квадратный корень

float sqrt (float x)
  { float xhalf = 0.5 * x;
    int i = *(int*) &x;
    i = 0x5F375A86 - (i >> 1);
    x = *(float*) &i;
    return = x * (1.5 - xhalf * x * x);
  }

Гениальный код, я считаю. Четыре умножения с плавающей точкой, одно вычитание с плавающей точкой, одно целочисленное вычитание и один битовый сдвиг, и получается почти точный квадратный корень. Подробности здесь и далее по ссылкам.

Говорят, этот алгоритм придумал кто-то из разработчиков Quake3.