楼主,我以前计算快速平方,就用平方根倒数的函数,返回 x*y就是平方根,测试了文中的快速平方根,发现其误差稍大,是不是那个常数的问题?那个常数0x1fbd1df5具体是怎么算的?
float FInvSqrtRoot(float x)
{
long i = 0;
float y, halfx;
halfx = 0.5 * x;
i = *(long*) &x; // 按照整型方法操作浮点数
i = 0x5f3759df - (i >> 1); // 魔法?
y = *(float*) &i; // 获得平方根倒数近似值
y = y * (1.5 - halfx * y * y); // 一次牛顿迭代
// return y; //返回平方根倒数
return (x*y); //返回平方根, 这个计算比上文中的快速平方根更精确。
} |
英文论文把数字拆开讨论的,看完这个再回去看论文,会有更多收获。