Quake-III Arena (雷神之锤3)是90年代的经典游戏之一。该系列的游戏不但画面和内容不错,而且即使计算机配置低,也能极其流畅地运行。这要归功于它3D引擎的开发者约翰-卡马克(John Carmack)。事实上早在90年代初DOS时代,只要能在PC上搞个小动画都能让人惊叹一番的时候,John Carmack就推出了石破天惊的Castle Wolfstein, 然后再接再励,doom, doomII, Quake...每次都把3-D技术推到极致。他的3D引擎代码资极度高效,几乎是在压榨PC机的每条运算指令。当初MS的Direct3D也得听取他的意见,修改了不少API。
上述故事得以发生,功臣之一便是InvSqrt函数。
本篇算法自己也没深入理解,作为自己的知识储备。下面代码来自于技术讨论群。
#include <iostream>
using namespace std;
//神奇高效的InvSqrt算法
//功能: 求一个数的开平方的倒数, 即返回1/sqrt(x), 但该函数比标准的sqrt()函数快4倍!!!!
float InvSqrt(float x)
{
float xHalf = 0.5f * x;
int i = *(int *)&x;
i = 0x5f3759df - (i >> 1);
x = *(float *)&i;
x = x * (1.5f - xHalf * x * x);
return x;
}
void main()
{
cout << InvSqrt(4) << endl;
cout << InvSqrt(9) << endl;
cout << InvSqrt(16) << endl;
}
运行结果:
取倒数:
精度和速度相比,速度已经占了很大优势。
对于精度这块,我的老师说的一句话很在理:(花4000元追求100%的完美)跟(花1000元追求99%+速度)这两者你觉得哪个值呢?