站内搜索: 

关于我们

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

2021年2月刊

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

浮点数学函数异常处理方法
信息来源:《数学大世界》杂志社官方网站 发表时间: 2020/11/25 阅读数:279

浮点数学函数异常处理方法

摘要异常会造成程序错误,实现完全没有异常的浮点计算软件也很艰难,因此,实现有效的异常处理方法很重要.但现有的异常处理并不针对浮点运算,并且研究重点都集中在整数溢出错误上,而浮点类型运算降低了整数溢出存在的可能.针对上述现象,面向基于汇编实现的数学函数,提出了一种针对浮点运算的分段式异常处理方法.通过将异常类型映射为64位浮点数,以核心运算为中心,将异常处理过程分为3个阶段输入参数检测(处理INV异常)、特定代码检测(处理DZE异常和INF异常)以及输出结果检测(处理FPF异常和DNO异常),并从数学运算的角度对该方法采用分段式处理的原因进行了证明.实验将该方法应用于Mlib浮点函数库,对库中600多个面向不同平台的浮点函数进行了测试.测试结果表明该方法能够将出现浮点异常即中断的函数个数从90%降到0%.同时,实验结果验证了该方法的高效性.

关键词浮点数数学函数异常处理

无论是解决素数分布问题的基础科学、实现全球天气预报的应用科学、验证导弹飞行实验的工程项目,还是日常生活中一张图片的显示(依赖于余弦变换)、一个通信的建立(依赖于语音采样)都离不开浮点计算,而对于计算而言,最基本的要求就是其结果的绝对正确性,但这个基本要求在计算机系统中很难得到保证.目前,科学计算大多使用浮点硬件,且都遵循IEEE-754浮点标准Ill,此标准定义的浮点数在数轴上呈离散态,在计算过程中需要对计算结果进行近似表示,而计算总是伴随着舍入,增加了浮点不精确甚至异常的可能.例如由于浮点数转整数出现的整数溢出异常,欧洲Ariane 5火箭在19%年发射时出现了严重的升空自爆现象[z],造成了巨额的经济损失.2010年,由于控制软件异常导致的丰田汽车刹车问题,同样给个人带来了极大的安全隐患(31.这些事件都表明了浮点数计算异常的危害性及其难以控制性此外,即使没有浮点计算异常,在常规计算中也可能出现非常规情况,即所谓的病态条件加文献中的函数

这就是浮点计算的特点,在计算精度有限的情况下,计算方法的不同将可能导致计算结果的多样性.要想获得准确的计算结果,只能通过使用更高精度的计算方法实现.然而无论采用什么样的计算方法、设置多高的精度,都避免不了异常对计算的干扰,只有有效控制并处理好异常,才能确保计算的精确性,提高软件的可靠性.

当然,实现一个不会产生浮点异常的数值计算软件是异常困难的至今一直有很多学者致力于软件的可靠性、函数异常等相关领域的研究.从整个软件的可靠性角度出发,基于形式化分析实现的软件测试及验证工具在证明系统中将IEEE浮点标准形式化的工具Coq,Gappa等都被广泛应用于软件的可靠性验证中,但依然少有直接针对浮点计算实现的形式化分析方法.

另一方面,从具体的异常角度出发,Hong等人对浮点数参与四则运算时的异常状况做了详细的分析,根据运算规则给出了无穷数参与运算后的返回值,为浮点计算软件的异常分析提供了支持.而对于浮点计算软件的异常研究,自Goodenough将异常处理方法进行符号化、Cristian成功实现应用后,其基本原理就没有发生大的变化.但还是有很多研究人员致力于这方面的研究,他们试图在新的语言或新的应用环境下获得更有效的异常处理方式,Garcia61,Gabral等人对这类研究进行了详尽的对比分析.这些研究都具有一个共同的特点,都是基于C++.Java等面向对象语言实现.

除此之外,能够对异常处理起到指导作用的异常检测方面的研究也在蓬勃发展中,特别是对整数溢出的研究.基于动态检测技术,通过检测所有可能产生溢出的操作而实现的RICH工具卢锡城提出一种二进制高危整数溢出错误的全自动测试方法DAIDT伙基于静态区间分析,利用future bounds对变量进行处理的整数溢出分析算法.诸多研究都在不断地提高着软件的可靠性.

虽然针对异常的研究很多,但目前的研究都存在一定的局限性首先,现有的方法不针对浮点函数设计,且浮点函数以浮点运算为核心其次,浮点函数使用汇编语言实现,现有的方法并不针对汇编最后,现有方法的研究重点都集中在整数溢出错误上,而浮点函数的运算降低了整数溢出存在的可能.上述因素造成了当前研究成果直接在基础浮点函数中应用的局限性.

基础浮点函数最大的特点就是高效性,如何在保证函数运行高效的基础上实现高可靠的异常处理机制,是本文面临的最大挑战之一围绕这一挑战,本文利用寄存器运算快的特点实现了浮点异常的编码利用浮点函数计算集中的特点实现了基于核心运算隔离技术的分段式异常处理方法.该方法以准确处理各类异常为首要目标,并辅以将异常处理对函数性能的干扰降到最低的要求,充分利用各类异常伴随的错误码不同、可能触发的位置不同、触发条件不同的特点,围绕核心运算,将异常分为3个阶段进行处理输入参数处理阶段,通过对输入参数的检测,保证进入核心运算的参数不会触发INV异常特定代码检测阶段,在核心运算执行过程中检测并处理可能出现的DZE异常和INF异常输出结果处理阶段,在核心运算后检测可能出现的FPF异常和DNO异常.由于在机器中的浮点数的存储是离散的,无法与实数一一对应,这使得浮点计算总是面临着舍入,所以在浮点函数的计算过程中INE异常几乎无处不在.因此在一般情况下,该异常总是处于屏蔽状态.就作者目前的了解,这是第一个针对汇编语言实现的,基于核心运算隔离的分段式浮点函数异常处理方法.分段式处理能够有效降低实现的难度,降低异常处理对函数性能的干扰.

本文的主要贡献

实现浮点函数异常的编码,将各类异常与浮点数相对应,利用寄存器运算快的特点,提高了异常处理的效率

提出一种适用于浮点函数的分段式异常处理方法,实现了异常处理与核心运算的分离,降低了异常处理过程对函数性能的干扰,为类似软件的异常处理提供了新的方法,并成功应用于608个浮点函数中

对新的异常处理方法的依据做了详尽的理论论证,为基于核心运算隔离的分段式异常处理方法在新的语言及环境中的扩展提供了可能

为了更加清晰地描述本文的问题,在第1节对浮点函数的异常类型做了详尽的阐述.在此基础上,第2节给出了整体的异常处理算法和异常处理方法有效性的理论论证及其重要的子算法,包括浮点函数异常编码、输入参数处理、特定代码检测、输出结果处理和异常返回.最后,利用第3节和第4节,分别对异常处理方法进行了测试分析和总结.

1浮点异常类型

浮点计算并不封闭,经常出现各类异常〔z'1.IEEE-754标准分别对各类异常进行了定义,分别是参数不符合输入要求的无效操作异常(invalid operation exception,简称INV)、除零异常(dividing by zero exception,简称DZE)、浮点溢出异常(floating-point flow exception,简称FPF)和不精确异常(inexact exception,简称INE).对于一般意义上的浮点计算,可能出现的异常状况都在IEEE-754标准定义的异常范围之内但对于本文研究的浮点函数(主要包括由一系列浮点计算实现的三角类函数、指数类函数等初等函数,由于其计算的复杂性以及对计算高可靠的要求,还包含以下两种异常非规格化数异常(denormal operand exception,简称DNO)和整数溢出异常(integer flow exception,简称INF).

为了更好地理解浮点异常,有必要先了解浮点数的分类和特性.浮点函数的实现采用的是IEEE-754标准的浮点数表示形式.IEEE-754定义了一些特殊值以提高特殊情形下的处理能力,而这些特殊值却是浮点异常被触发的最大根源.IEEE-754标准通过指数将浮点表示空间划分成5类数非数(not a number,简称NaN)、无穷数(ink、有限数、零和非规格化数(denormal floating-point,简称dnp).

NaN是为了方便而提出的一种表示方法,其指数部分是最大值,隐含位(也叫整数位)1,但尾数部分不是O.NaN有两类一类是QNaN(quiet NaN),一般表示未定义的算术运算结果一类是SNaN(signal NaN),一般被用于标记未初始化的值,两者均能触发异常.

浮点函数在实现过程中可能面临多种异常类型,其中,每一类异常又可能存在多种表现形式,触发的条件、返回的错误码等都有不同的呈现.

360 百度 中国知网 全网目录