记--平方根的算法

Java实现
牛顿迭代法:

double sqrt(double c)
{
      if(c<0)return Double.NaN;
      double err=1e-15;
      double c=t;
      while(Math.abs(t-c/t)>err*t)
      {
         t=(t+c/t)/2.0;
      }
return t;
}

C/C++实现
3d游戏引擎算法实现1/sqrt(x),改一下返回值成为sqrt()算法:

float _sqrt(float t)
{
    float thalf=0.5f*t;
    int i = *(int *)&t;//get bytes for floating VALUE 很神奇的一步
    i = 0x5f375a86 - (i >> 1); //gives initial guess y0; 这个数字也是很神奇的
    t= *(float*)&i;//convert bits Back to float
    t = t* (1.5f-thalf*t*t);//牛顿迭代法
    t = t * (1.5f - thalf * t*t);//牛顿迭代法
    t = t * (1.5f - thalf * t*t);//牛顿迭代法
    return 1/t;
}

1/sqrt():平方根的倒数算法

float _sqrt(float t)
{
    float thalf=0.5f*t;
    int i = *(int *)&t;//get bytes for floating VALUE 很神奇的一步
    i = 0x5f375a86 - (i >> 1); //gives initial guess y0; 这个数字也是很神奇的
    t= *(float*)&i;//convert bits Back to float
    t = t* (1.5f-thalf*t*t);//牛顿迭代法
    t = t * (1.5f - thalf * t*t);//牛顿迭代法
    t = t * (1.5f - thalf * t*t);//牛顿迭代法
    return t;
}

这两个算法都非原创,只是在这里记载一下,各位大神不喜勿喷。
另外第二个算法是个很有意思的故事。这里贴下链接https://blog.csdn.net/qq_26499321/article/details/73724763

你可能感兴趣的:(记--平方根的算法)