站内搜索: 

关于我们

《数学大世界》杂志简介 简介信息: 《数学大世界》是经国家新闻出版总署批准,创刊于1994年。为了进一步深化新课程改革,促进学术交流、促进数学专业教育人才的快速成长,《数学大世界》杂志社将隆重推出以面向大、中、小学教师和教科研人员为主要读者对象的教学辅导刊物,为广大数学爱好者提供一个相互促进、共同探究的交流平台。 《数学大世界》为月刊,国内刊号...>>更多

2021年8月刊

您的位置:首页 > 2021年8月刊

浮点数学函数库测试
信息来源:《数学大世界》杂志社官方网站 发表时间: 2021/9/26 阅读数:205

浮点数学函数库测试

目前,传统的精度测试工具[27-29]中的测试方法大多采用近似求解的方法计算函数真值,且计算精度一般限定在单精度或双精度范围内这类方法计算速度快、测试时间短,但函数计算值的精度受限,无法精细化地计算函数实际精度情况,只能以OULP,IULP,2ULP,...这样的整数形式表示函数精度(如第5.2节中的精度测试结果).这类方法计算的函数真实值与被测函数的精度相同(以双精度为例,都精确计算53位尾数,以下都以双精度为例),需要在第53位进行舍入处理等浮点操作,这就可能造成函数真实值的精度损失,导致测试误差.为了解决上述函数真实值精度损失的问题,本文引入多精度函数库MPFR进行函数真实值计算.MPFR作为参照数学库库中基本包括了300个以上的基础数学函数,并且在理论上提供对任意精度浮点函数的支持,利用此多精度库进行函数计算的唯一限制在于体系结构的内存大小,只要内存资源足够,可以支持任意精度的浮点函数计算引入多精度函数库进行函数真实值计算,提高了精度测试的准确性,因为在测试过程中获得了没有精度损失的函数真实值(保证53位尾数正确).但不可否认,此方法带来了新的问题:增加了测试时间,同时消耗了更多的存储空间为了有效缓解基千多精度库的测试方法运行开销较大的问题,本文在精度测试过程中对函数真实值所需精度进行判断,以找到能够保证53位尾数正确的最小计算精度通过测试分析,对千sin,cos,explog等三角函数、指数对数函数来说,该最小精度为60位(采用多精度库进行计算的过程中,精度达到60即可保证函数真实值的53位正确,没有精度损失);而对千数值类函数,则最小精度为53位这样的处理使得计算的每一位函数真值都发挥了作用,没有冗余位,减少了测试时间和内存消耗,其具体实现算法如下.

功能:实现对精确值计算精度P的判断,并计算函数精确值//输入:测试数据集,被测函数,M=80;//输出精度位数P及函数精确值计算结果

1.mp__inits2(53,.x1,...);mp__inits2(M,.x。,..);p[M-53]=2;II初始化

2.mp__FUNC(y0,.x0,MPFR_RNDN);II计绊精度为M的函数计算值

3.i=53,j=M,K=(M-53)12+53;

4.while(K!==M&K!==53)do5.mp__inits2(K,.x2,...);

6.mp_FUNC(y2,MPFR_RNDN);

7.p[K-53]=REULP(y0,y2);II测试精度为K的函数计算值的误差

8.if(p[K-53]==0){K=j;K=(K-i)l2+i;}

9.else{K=i;KK)l2+i;}

10.end

11.if(K==53){

12.mp__FUNC(y1,.x1,MPFR_RNDN);

13.P[O]=REULP(y初);14.if(p[O]=O)P=53;

15.elseP=54;}

16.P=KM[K-53],'10')+54;II将数组p[·]看作字符串,并利用字符串匹配算法KMP搜索子串10(二进制)的位置

17.end

其中,REULP(-)函数为误差测试函数,返回值为01:0表示当前精度下计算的函数值的前53位完全正确,l表示前53位存在误差,有精度损失

该算法首先选取一个较大的精度值M作为参照(M应大千等千53,在此,选取经验值80作为M的初值),再利用二分法思想查找引起函数计算值前53位误差发生变化的精度值其中,变化表现为相邻两个精度值的误差由1变为0,即算法步骤1610的由来.

在此基础上,本文精度测试采用如下的计算过程,并以相对ULP作为衡姚数学函数库与MPFR库计算结果差异的标准:

其中Function(x)Mub代表被测函数库中函数的计算结果,Function(x)mpfr代表此函数在MPFR上的计算结果,ulpmfpr代表MPFR上的计算结果的ULP值以相对ULP值的方式衡量两者的差值具有两个方面的好处:一是其不存在绝对误差并不能完全地表示近似值的好坏程度的问题,能够直观地反映计算值与精确值之间的近似程度;二是能够更直观地反映出浮点数误差的特点

3.2基千代码隔离的性能测试方法

一方面,现有测试工具并没有集成性能测试,降低了测试工具的适用性,另一方面,传统的性能测试方法在进行数学函数库测试时不够准确传统的测试方法只是简单地利用时间计数器的前后差值来计算函数运行时间,在测试过程中会受到函数外未完成的访存操作或函数首次加载的影响,导致测试结果的准确性降低.假设外部影响所消耗的时间为b,而被测程序的实际时间消耗为a,a>>b时,我们可以认为忽略b对测试结果基本不造成影响,这也是目前多数大型程序测试还在延用此方法的原因所在;否则,这种影响将是致命的,会造成测试结果的严重偏差.不幸的是,数学函数库中的每一个函数都是这样的状况.

数学函数库往往有高性能需求,函数运行时间只有几十到几百拍不等,如本课题组实现的Mlib函数库中的sin函数性能为78拍,fabs函数为17拍(运行平台的主频为1000MHz,不同的体系结构下函数运行时间可能不同),所以外部环境的微弱影响都可能影响函数性能测试的准确性.鉴千此,本文利用函数预热、存储栏栅等代码隔离技术降低外部环境对函数测试的影响,以实现准确的性能测试.

360 百度 中国知网 全网目录