LINUX.ORG.RU

История изменений

Исправление no-such-file, (текущая версия) :

Как-то так

const float precalculatedApproxConstant = 0x5f3759df;

float square(float x) {
   return x*x;
}

float firstApproximation(float x) {
  int i = *(int*)&x;
  i = precalcualtedApproxConstant - (i >> 1);
  return *(float*)&i;
}

float secondApproximationNeuton(float firstApproximantion, float x) {
  return firstApproximation*(1.5f-(0.5f*x*square(firstApproximation)));
}

float invertedSquareRoot(float x) {
  return secondApproximationNeuton(firstApproximation(x), x);
}

Я полагаю конвертирование типов и умножение на 2 можно отдельно не расписывать, т.к. это идиомы Си.

Исходная версия no-such-file, :

Как-то так

const float precalculatedApproxConstant = 0x5f3759df;

float square(float x) {
   return x*x;
}

float firstApproximation(float x) {
  int i = *(int*)&x;
  i = precalcualtedApproxConstant - (i >> 1);
  return *(float*)&i;
}

float secondApproximationNeuton(float firstApproximantion, float x) {
  float xhalf = 0.5f * x;
  return firstApproximation*(1.5f-(xhalf*square(firstApproximation)));
}

float invertedSquareRoot(float x) {
  return secondApproximationNeuton(firstApproximation(x), x);
}

Я полагаю конвертирование типов и умножение на 2 можно отдельно не расписывать, т.к. это идиомы Си.