有用的函数--功能:求平方根倒数

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语言编写一个计算器程序,实现加,减,乘,除,求平方根(正数),倒数等功能.

速求平方根倒数

C语言求一个数的倒数的平方根近似值

MATLAB可视化实战系列(二十八)-贪心算法求快速平方根倒数算法中的“魔术数字”含matlab源代码

2-3 求平方与倒数序列的部分和

2-3 求平方与倒数序列的部分和