1 目的
本文阐述了常用的开方算法的原理,重点描述了整数开方算法的实现并给出实例源码,旨在提高不带FPU的处理器处理开发的效率。
2 常用的开方算法
2.1 逼近法
2.1.1 二分法逼近
选取一个平方值大于目标值a的值b,和一个小于目标值的值c,取中间值d=(b+c)/2的平方e与a比较,若偏大,设置b的新值为d,否则设置c的新值为d,直至d的平方等于a或者b和c相等位置。这种猜测操作简单,但迭代次数过多,这里不详细描述,亦不给出源码。
2.1.2 牛顿法逼近
我们知道,在二维曲线的上的一点,沿着切线方向的变化速度最大。所以,如果我们确定了一个函数g(x),并且知道了它的目标值a对应的x的值,求g(x)=a等效于求g(x)-a的零点。取起点为x0,只考虑泰勒展开的前面两项,就是f(x)=g(x)-a=0的切线,亦即f(x0)+f'(x0)*(x-x0)=0,那么x=x0-f(x0)/f'(x0),对于开方,f(x)=x^2,那么,我们求的x=x0-(x0^2-a)/(2*x0)=(x0+a/x0)/2,再以x为新起点不断迭代,直至x和x0相等或者x的平方等于a为止。
2.2 数学法分离
类似于我们数学的常规思维,以10机制为例,我们知道,每一位的平方的结果,要么是个一位数(eg.2x2=4),要么是个两位数(eg.7x