上一篇文章讲到了估商法的原理,有了一个不错的效率,但在要求精度较大时,速度和迭代法相比差距很大。
除法:u/y=u*(1/y);
先讲一下倒数迭代式:x1=(2-y*x0)*x0,x0是y的倒数的近似值,它必须要小于y的倒数。另外迭代式中的乘法子程序要选用快速乘法(如FFT算法的乘法子程序)。
否则迭代法的除法速度是很慢的,远远小于估商法。
以求9的倒数为例演示迭代法的使用,求9的32精度的倒数:
1/9=1.1111111111111111111111111111111e-1;这里计算的是9的32位精度的倒数
(2-9*0.11)*0.11=1.111e-1; 现在我们用初值0.11迭代计算32位精度的倒数
(2-9*0.1111)*0.1111=1.1111111e-1;
(2-9*0.11111111)*0.11111111=1.111111111111111e-1;
(2-9*1.111111111111111e-1)*1.111111111111111e-1 = 1.1111111111111111111111111111111e-1;
对于如何确定y的初值,网上找不到相关的文献,我最早是有估商法算y的前N位的初值,然后迭代算出精度更高的倒数。
但是这种方法在综合运算时,估商法存在大量的进制转换,和指数对位,效率不高。
前一段时间才突破用计算器的cpu的除法功能计算除数倒数的初值,这个问题原理很简单:(就是取除数的前几位有效数,用cpu算倒数,然后取倒数的