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

为何卡马克开平方算法精确度这么低

2013-08-27 
为什么卡马克开平方算法精确度这么低?本帖最后由 Razor87 于 2013-07-18 21:50:46 编辑代码如下:#include

为什么卡马克开平方算法精确度这么低?
本帖最后由 Razor87 于 2013-07-18 21:50:46 编辑 代码如下:

#include <iostream>
#include <math.h>
using namespace std;
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;
}

float CarmSqrt(float x)
{        union{
                int intPart;
                float floatPart;
        } convertor;
        union{
                int intPart;
                float floatPart;
        } convertor2;
        
        convertor.floatPart = x;
        convertor2.floatPart = x;
        convertor.intPart = 0x1FBCF800 + (convertor.intPart >> 1);
        convertor2.intPart = 0x5f3759df - (convertor2.intPart >> 1);
        return 0.5f*(convertor.floatPart + (x * convertor2.floatPart));
}

int main(){
        float a = 0.25;
        cout << InvSqrt(a) << endl;
        cout << CarmSqrt(a) << endl;
        cout << sqrt(a) << endl;
        return 0;
}


结果如下:
1.99661
0.488594
0.5
请按任意键继续. . .


为什么误差这么大?
[解决办法]
因为只迭代了一次。要速度当然就降低精度了。
[解决办法]
精度是根据需要来的,有时候要不了那么高的精度,为了速度快一点精度牺牲一些也是有的。

热点排行