用C语言将一个数开根号后再取倒数的方法

来源:互联网 发布:unity3d ugui官方demo 编辑:程序博客网 时间:2024/06/03 01:22

在上学的时候,曾经看过有人写过这样的算法,就是将一个数开根号后再取倒数的算法,我本人也觉得十分巧妙,于是就将它积累了下来,让我们来看看是怎么回事:

#include <stdio.h>#include <stdlib.h>float mysqrt(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;  }  int main(void){float x = 2.5 ;float ret = mysqrt(x);printf("%f\n",ret);return 0 ;}

它的作用是将一个数开平方并取倒,经测试这段代码比(float)(1.0/sqrt(x))快4倍
算法的原理其实不复杂,就是牛顿迭代法,用x-f(x)/f'(x)来不断的逼近f(x)=a的根。
简单来说比如求平方根,f(x)=x^2=a ,f'(x)= 2*x,f(x)/f'(x)=x/2,把f(x)代入x-f(x)/f'(x)后有(x+a/x)/2,现在我们选a=5,选一个猜测值比如2,那么我们可以这么算
 
5/2 = 2.5;
(2.5+2)/2 = 2.25;
5/2.25 = xxx;
(2.25+xxx)/2 = xxxx
...

运行结果:


0 0
原创粉丝点击