首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

怎么让向量快速单位化呢

2013-07-11 
如何让向量快速单位化呢?现在看到的书上都是使用 让向量除模长的方法,但是模长需要开方,比较慢,有没有什么

如何让向量快速单位化呢?
现在看到的书上都是使用 让向量除模长的方法,但是模长需要开方,比较慢,有没有什么比较快的方法呢?
[解决办法]
没有更快的办法,  数学公式就是那样

但是具体实现的时候,  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。

热点排行