大数除法之迭代法

来源:互联网 发布:浩方对战平台mac版本 编辑:程序博客网 时间:2024/06/10 01:50

上一篇文章讲到了估商法的原理,有了一个不错的效率,但在要求精度较大时,速度和迭代法相比差距很大。

      除法: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算倒数,然后取倒数的前几位有效位,转换      成高精表现形式,用这个高精形式的倒数作为迭代式的初值,可以迭代出你所需的更高精度的倒数)

   但实现起来还是相当复杂的,三分的算法原理,七份的调试。

   注:这里讨论的都是有理数,不是正整数(只能对正整数加减乘除的子程序进行综合运算时是相当费时费力的,并且很难保证正确性)!

利用cpu 算初值,由于cpu除法的局限性,过小的或过大的数它都计算不了,所以这些数你必须调整规范为0.xxx...*10^n的形式,其中xxx必须为有效数字,1234可以表示为0.1234*10^4,但不能为0.01234*10^5,这都是调试才能理解的技术,不调试你很难理解,

选取除数的前几个有效数字用cpu算倒数,这里是8.1037277147487844408427876823339e-4,cpu算出的倒数你还必须识别并换算成高精度数的表示形式,才能进行后面的迭代运算,后面的迭代运算需要有理数的加,减,乘支持。

纯迭代法实现的除法代码更简洁,效率更高,特别是作为子程序调用时可以减少一些中间转换,在综合运算中效率是估商配迭代法的一倍左右。

原创粉丝点击