上学的时候,我见过一个人写了这样的算法。 一种将某个数加上根号再取倒数的算法。 我自己也觉得非常巧妙,所以把它堆起来,看看怎么样了。
# include stdio.h # include stdlib.hfloatmysqrt (floatx ) { float xhalf=0.5f * x; intI=*(int* ) x; I=0x5f3759df-(I1; x=*(float* ) I; x=x*(1.5f-xhalf*x*x ); 返回x; (intmain ) void ) {float x=2.5; floatret=mysqrt(x; printf(%f(n ),ret ); 返回0; }其作用是平方并撤销一个数,测试的代码比(float ) (1.0/sqrt(x ) )快4倍
算法的原理其实并不复杂。 用牛顿迭代法,用x-f(x )/f ) ) x )逼近f ) x )=a的根。
简而言之,当求平方根、f(x )=x^2=a,f ) ) x ) x,f ) x )/f ) x ) ) x )求出x/2,并将f ) x )代入x-f(x )/f ) x ) x )时
5之5/2=2.5;
(2.5 2)/2=2.25;
5/2.25=xxx;
(2.25 xxx )/2=xxxx
.
执行结果: