Page 31 - 《软件学报》2020年第12期
P. 31

赵世忠  等:循环迭代程序的一种可信计算算法                                                           3697


             4:   while j≤n do
                                  n−j
             5:      β[j]⇐extra_precision ;
             6:      if j=1 then
             7:         y ⇐       1  f    1 (, ,...,x x    1  2  x    m )   εβ×  [1]  ;  //计算 f 1 精度为ε×extra_precision n−1 的值.
             8:         j⇐j+1;
             9:      else if j>1 then
             10:        (, ,,y k ε 0  enough ) ⇐  AccurateEnough ({( , [ ]) |1y β     i  i  i  j − ≤≤  1}, f  j ,ε  ×  β  [ ])j ;

                      j
             11:        if enough=true then
             12:           j⇐j+1;
             13:        else
             14:           l⇐l+1;   //修改 l 的值.
                                      l
             15:           extra_precision⇐0.1 ;   //修改精度步长
             16:           j⇐1;  //重新开始
             17:        end if
             18:     end if
             19: end while
             20: return  y   ;
                       n
             在上述算法中,为了提高计算效率,我们令 y i 的精度超过 y i+1 (1≤i<n)的精度.并且,所有精度构成等比数列.
         需要注意的是:若某一次的精度不满足要求,那么一定要像第 16 行那样(提高精度后)从头开始计算.

         4    案例分析与验证

             对于前述算法,我们已用 C++语言编程实现于 ISReal                [7,8] .程序及有关文档的下载网址是:http://www.
         isrealsoft.cn/download.htm.ISReal 的现有版本采用 GMP 的整数运算作为底层运算,并且输入与输出均是字符串,
         所以采用前述算法的 ISReal 得出的结果是正确结果.除此之外,ISReal 用“y”与“:=”分别代表迭代的函数名与赋
         值符号.比如,式(1)中第 1 个赋值语句可以写成这种形式:y1:=2.另外,为了方便操作,ISReal 利用小数位数取代误
                                            n
         差限(或精度).比如:若结果的误差限为 0.1 ,则 ISReal 会令结果保留 n 位小数,对应设置函数(或命令)为
         DecimalPlaces.
             例 4.1:计算式(1)中的 u 30 ,结果保留 16 位有效数字.
             由于迭代的极限值为 6,因此不妨令结果保留 15 位小数.这时,由程序的运行过程可知:只有 u 3 重复计算了 5
                                 5
         次 , 即 l=5,extra_precision=0.1 . 这样 , 计算时 ,u i (1≤i≤30) 的误差限为 0.1 15+(30−i)×5 . 最终的 输出结果为 :
         u 30 =6.006786093031206.
             下面的图 2 展示了 ISReal 在计算 u 30 时的环境界面,其中包括 5 行输入与 1 行输出.
             例 4.2:计算式(2)中的 u 32 ,结果保留 100 位有效数字.

             类似于例 4.1,由于迭代的极限值为 5,因此不妨令结果保留 99 位小数.这时,由程序的运行过程可知:只有 y 3
                                           5
         重复计算了 5 次,即 l=5,extra_precision=0.1 .这样,计算时,y i (1≤i≤32)的误差限为 0.1  99+(32−i)×5 .最终输出结果为:
         y 32 =4.99999973471133152416344898867038732090718155847042406411602067150199474070118455323008329
         5123968309.
             例 4.3:计算式(6)中的 y 9 ,结果保留 16 位有效数字.
             由于迭代的每个值均为 0.5,因此令结果保留 16 位小数.这时,由程序的运行过程可知:只有 y 2 重复计算了 2
                                2
         次,即 l=2,extra_precision=0.1 .这样,计算时,y i (1≤i≤9)的误差限为 0.1 16+(9−i)×2 .最终输出结果为 y 9 =0.5.
   26   27   28   29   30   31   32   33   34   35   36