有用的函数--功能:求平方根倒数
Posted 刘二毛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有用的函数--功能:求平方根倒数相关的知识,希望对你有一定的参考价值。
来源于 著名游戏《雷神之锤III》,它的代码在2002年左右被披露,发现了一段用于快速计算平方根倒数的代码
float InvSqrt (float x)
float xhalf = 0.5f*x;
int i = *(int*)&x; // get bits for floating value
i = 0x5f3759df - (i >> 1);// L1:gives initial guess y0
x = *(float*)&i; //l2:convert bits back to float
x = x*(1.5f - xhalf*x*x); //l3:Newton step, repeating increases accuracy
return x;
经测试,比一般的
一般的代码(float)(1.0/sqrt(x))快很多
该算法的本质其实就是牛顿迭代法(Newton-Raphson Method,简称NR)。NR是一种求方程的近似根的方法。首先要估计一个与方程的根比较靠近的数值,然后根据公式推算下一个更加近似的数值,不断重复直到可以获得满意的精度。其公式如下:
函数:y=f(x)
其一阶导数为:y'=f'(x)
则方程:f(x)=0 的第n+1个近似根为
x[n+1] = x[n] - f(x[n]) / f'(x[n])
求一个数a的平方根的倒数,实际就是求方程f(x)=1/(x^2)-a=0的解;将该方程按牛顿迭代法的公式展开为:
x[n+1]=x[n]*(3/2-a/2*x[n]*x[n])
以上是关于有用的函数--功能:求平方根倒数的主要内容,如果未能解决你的问题,请参考以下文章
用C语言编写一个计算器程序,实现加,减,乘,除,求平方根(正数),倒数等功能.