Код ниже выполняет быструю операцию обратного квадратного корня с помощью некоторых битовых хаков. Алгоритм, вероятно, был разработан Silicon Graphics в начале 1990 года и появился в Quake 3. больше информации
Тем не менее, я получаю следующее предупреждение от компилятора GCC C++: разыменование указателя типа-наказание нарушит правила строгого наложения имен
Стоит ли использовать в таких ситуациях static_cast
, reinterpret_cast
или dynamic_cast
?
float InverseSquareRoot(float x)
{
float xhalf = 0.5f*x;
int32_t i = *(int32_t*)&x;
i = 0x5f3759df - (i>>1);
x = *(float*)&i;
x = x*(1.5f - xhalf*x*x);
return x;
}