如何让向量快速单位化呢?
现在看到的书上都是使用 让向量除模长的方法,但是模长需要开方,比较慢,有没有什么比较快的方法呢?
[解决办法]
没有更快的办法, 数学公式就是那样
但是具体实现的时候, 1/sqrt函数的近似算法是可以优化的
下面是带注释的计算1/sqrt(x)算法, 来自Quake的源程序
float InvSqrt(float x)
{
float xhalf = 0.5f*x;
int i = *(int*)&x; // get bits for floating value
i = 0x5f375a86 - (i>>1); // hidden initial guess
x = *(float*)&i; // convert bits back to float
x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
// x = x*(1.5f-xhalf*x*x); // add this in for added precision, or many more...
return x;
} // InvSqrt
如果是double类型的计算,用0x5fe6ec85e7de30da。
但是值得注意的是第一次迭代的精度在 0.02 左右,第二次迭代精度在 5E-4 左右
这个是近似算法,在对速度要求很高,而对精度要求不是很高时可以考虑。
[解决办法]
可以使用SSEn指令,sqrtss、sqrtsd、sqrtps、sqrtpd、rsqrtps、rsqrtss。