CN109840067B - 一种基于数学近似的浮点程序精度缺陷修复方法 - Google Patents
一种基于数学近似的浮点程序精度缺陷修复方法 Download PDFInfo
- Publication number
- CN109840067B CN109840067B CN201910033498.4A CN201910033498A CN109840067B CN 109840067 B CN109840067 B CN 109840067B CN 201910033498 A CN201910033498 A CN 201910033498A CN 109840067 B CN109840067 B CN 109840067B
- Authority
- CN
- China
- Prior art keywords
- precision
- program
- function
- mathematical
- floating point
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Landscapes
- Complex Calculations (AREA)
Abstract
一种基于数学近似的浮点程序精度缺陷修复方法,其步骤包括:步骤S1.预处理;步骤S2.定位精度缺陷:使用线性搜索算法查找包含能触发精度缺陷的最小输入区间Ierr;步骤S3.生成数学近似;步骤S4.补丁生成和优化;步骤S5.补丁验证:对最小输入区间Ierr进行采样,测试所有采样输入对应的修复后的浮点程序的输出是否满足精度需求,若满足则修复结束,若不满足且分配的计算资源还未耗尽则返回S2重新执行,若计算资源已经耗尽,则返回修复未完成,修复结束。本发具有能够提高修复能力、满足给定精度需求等优点。
Description
技术领域
本发明主要涉及到浮点运算的技术领域,特指一种一种基于数学近似的浮点程序精度缺陷修复方法。
背景技术
浮点运算被广泛应用于航空航天、金融、科学计算、物理仿真等各个领域中。浮点数在计算机中用来近似表示实数,由于浮点数的有限位数表示,浮点表示实数时可能会存在舍入误差,比如实数上的0.1在64位浮点数表示为0.100000001490116119384765625。因此,在浮点数计算过程中不可避免的会引入误差,特别是在浮点计算密集的浮点程序中,误差可能累积和放大,使得程序输出无法满足用户对结果的精度需求,产生精度缺陷。人工修复精度缺陷,需要维护人员有浮点运算和数值计算相关的专业知识,因此为了帮助维护人员修复精度缺陷,研究人员提出了浮点程序精度缺陷的修复方法。
浮点程序精度缺陷修复方法目的是修复精度缺陷。现有浮点程序精度缺陷修复方法主要包括以下三个步骤:
S1:定位精度缺陷,即找到引发精度缺陷的浮点表达式。
S2:补丁生成,即对定位到的浮点表达式使用数学规则进行变换生成新的表达式。
S3:补丁验证,即判断变换后的的浮点表达式相比于原表达式是否提升了精度,若提升,则返回新生成的表达式,否则执行S2。
以上传统的检测方式,存在一些不足之处:
1、修复能力不足:通过误差分析,可以发现引起精度缺陷主要是由于两方面的原因:一是程序执行过程中浮点计算引入的误差累积;二是浮点程序所对应的数学函数可能存在病态问题(条件数过大),导致浮点计算的误差被放大。现有的技术只尝试减少程序执行过程中浮点计算引入的误差来修复精度缺陷,没有针对病态问题引发的精度缺陷的有效修复方法。
2、修复不能满足给定的精度需求:现有技术主要基于数学规则,比如交换律、结合律等对引入误差的浮点表达式进行重写,重写的结果可能能提升浮点表达式计算结果的精度,但由于重写并没有以一个给定精度需求为目标进行修复,可能无法满足用户给定的精度需求。
发明内容
本发明要解决的技术问题就在于:针对现有技术存在的技术问题,本发明提供一种能够提高修复能力、满足给定精度需求的基于数学近似的浮点程序精度缺陷修复方法。
为解决上述技术问题,本发明采用以下技术方案:
一种基于数学近似的浮点程序精度缺陷修复方法,其步骤包括:
步骤S1.预处理;
步骤S2.定位精度缺陷:使用线性搜索算法查找包含能触发精度缺陷的最小输入区间Ierr;
步骤S3.生成数学近似:使用线性近似加误差补偿的方法来近似浮点程序在最小输入区间Ierr对应的数学函数执行,并使用迭代精化算法来生成满足给定精度需求的数学近似列表;
步骤S4.补丁生成和优化:将生成的数学近似列表转化为浮点程序补丁,然后对补丁执行性能进行优化;
步骤S5.补丁验证:对最小输入区间Ierr进行采样,测试所有采样输入对应的修复后的浮点程序的输出是否满足精度需求,若满足则修复结束,若不满足且分配的计算资源还未耗尽则返回S2重新执行,若计算资源已经耗尽,则返回修复未完成,修复结束。
作为本发明的进一步改进:所述步骤S1的步骤包括:
步骤S11.将程序加载至动态重编译框架中;
步骤S12.识别目标程序中的浮点运算指令并替换为高精度运算指令;
步骤S13.完成所有浮点指令的替换,生成目标程序的高精度执行版本。
作为本发明的进一步改进:计算程序输出误差的公式是:
其中fp(x)代表目标程序,f(x)代表目标程序对应的数学函数,x表示输入;
使用目标程序的高精度执行版本计算f(x)的输出值。
作为本发明的进一步改进:所述步骤S2使用线性搜索算法的具体步骤为:
步骤S21.从能触发精度缺陷的输入x做为初始点,并设定初始步长step;
步骤S22.根据步长选取新输入点,并搜索新输入点附近的输入是否能触发精度缺陷,若可以则调整步长step,并根据步长生成新的输入点,返回执行S22,若不可以,则进入S23;
步骤S23.对步长减半并对其值取反,根据步长选取新输入点,若步长小于给定阈值δ,存取新输入点,执行S25,否则执行S24;
步骤S24.搜索新输入点附近的输入是否能触发精度缺陷,若可以返回执行S23,若不可以对步长减半,根据步长选取新输入点,返回执行S24;
步骤S25.首次执行此步骤,重新选取x作为初始点,并设定初始步长为-step,返回执行S22,否则执行S26;
步骤S26.使用两次存下来的新输入点作为最小输入区间的边界产生能触发精度缺陷的最小输入区间Ierr。
作为本发明的进一步改进:所述步骤S21中计算初始步长的公式是:
step=ulp(x)*j
其中,x是初始输入点,j是一个正整数,ulp(x)的计算公式如下:
所述步骤S22和S23中根据步长选取新输入点的具体计算公式是:
x′=x+step
所述步骤S22中调整步长的具体计算公式是:
step=times*step
其中times是[1.5,3.0]之间的一个实数;
所述步骤S23中给定阈值δ大小是:
δ=ulp(x)*100。
作为本发明的进一步改进:所述步骤S3的具体步骤为:
步骤S31.线性近似:根据输入区间Ierr的两个端点{xs,xe}产生线性函数;
步骤S32.误差补偿:使用二次函c(x)来近似线性函数和实际数学函数之间的绝对误差函数AbsErr(x);
步骤S33.迭代精化:线性函数加上二次函数作为数学近似计算其和实际数学函数的输出之间的最大误差,并保存对应输入xnext;如果数学近似和实际数学函数之间最大误差满足精度需求,则存储数学近似到列表,否则,选取xnext作为新的端点,以{xs,xnext}和{xnext,xe}为输入,重新执行S31。
作为本发明的进一步改进:所述步骤S31中线性函数的具体公式是:
其中fl(x)的计算公式是:
fl(x)=k*(x-xs)+f(xs)
作为本发明的进一步改进:所述步骤S32中线性函数和实际数学函数之间的绝对误差函数的具体公式是:
AbsErr(x)=f(x)-l(x)
所述步骤S32中二次函数的具体公式是:
c(x)=λ*(x-xs)(x-xe)
其中,λ=AbsErr(xm)/(xm-xs)(xm-xe),xm=xs+(xe-xs)/2.0是xs和xe之间的中点;
作为本发明的进一步改进:所述步骤S4中补丁生成和优化方法的具体步骤是:
步骤S42.将数学近似列表用一个6元组列表保存;
步骤S43.使用程序数组来保存6元组列表,并使用基于数组构建索引计算函数来进行补丁优化,即对于输入x使用索引计算函数快速找到对应的数组元素,并构建数学近似计算输入对应的输出;
步骤S44.将程序数组和对应的索引计算函数存储为浮点程序对应补丁。
作为本发明的进一步改进:所述步骤S43中构建索引计算函数的具体是:
步骤S433.对P(x)取整得到索引计算函数。
与现有技术相比,本发明的优点在于:
1、本发明的基于数学近似的浮点程序精度缺陷修复方法,能够提高修复能力。通过误差分析,可以发现引起精度缺陷主要是由于两方面的原因:一是程序执行过程中浮点计算引入的误差累积;二是浮点程序所对应的数学函数可能存在病态问题(条件数过大),导致浮点计算的误差被放大。现有的技术只尝试减少程序执行过程中浮点计算引入的误差来修复精度缺陷,没有针对病态问题引发的精度缺陷的有效修复方法。本发明基于数学近似,完全依赖浮点程序对应的数学函数的输入输出,独立于程序执行,因此可以对病态问题引起的精度缺陷进行修复。
2、本发明的基于数学近似的浮点程序精度缺陷修复方法,能够满足给定精度需求。现有技术主要基于数学规则,比如交换律、结合律等对引入误差的浮点表达式进行重写,重写的结果可能能提升浮点表达式计算结果的精度,但由于重写并没有以一个给定精度需求为目标进行修复,可能无法满足用户给定的精度需求。本发明以给定的精度需求为目标,使用迭代精化算法迭代生成新的数学近似,使得修复结果能满足用户给定的任意精度需求。
附图说明
图1是本发明方法的流程示意图。
图2是本发明在具体应用实例中的迭代精化示意图。
具体实施方式
以下将结合说明书附图和具体实施例对本发明做进一步详细说明。
如图1所示,本发明的一种基于数学近似的浮点程序精度缺陷修复方法,其步骤包括:
步骤S1.预处理:对目标程序进行分析,生成目标程序的高精度执行版本。
步骤S2.定位精度缺陷:使用线性搜索算法查找包含能触发精度缺陷的最小输入区间Ierr。
步骤S3.生成数学近似:使用线性近似加误差补偿的方法来近似浮点程序在最小输入区间Ierr对应的数学函数执行,并使用迭代精化算法来生成满足给定精度需求的数学近似列表。
步骤S4.补丁生成和优化:将生成的数学近似列表转化为浮点程序补丁,然后对补丁执行性能进行优化。
步骤S5.补丁验证:对最小输入区间Ierr进行采样,测试所有采样输入对应的修复后的浮点程序的输出是否满足精度需求,若满足则修复结束,若不满足且分配的计算资源还未耗尽则返回S2重新执行,若计算资源已经耗尽,则返回修复未完成,修复结束。
在具体应用实例中,所述步骤S1的具体步骤为:
步骤S11.将程序加载至动态重编译框架中。动态重编译即是在程序执行过程中对程序部分进行重新编译。
步骤S12.识别目标程序中的浮点运算指令并替换为高精度运算指令。
步骤S13.完成所有浮点指令的替换,生成目标程序的高精度执行版本。
本发明中计算程序输出误差的公式是:
其中fp(x)代表目标程序,f(x)代表目标程序对应的数学函数,x表示输入。
本发明使用目标程序的高精度执行版本计算f(x)的输出值。
在具体应用实例中,所述步骤S2使用线性搜索算法的具体步骤为:
步骤S21.从能触发精度缺陷的输入x做为初始点,并设定初始步长step。
步骤S22.根据步长选取新输入点,并搜索新输入点附近的输入是否能触发精度缺陷,若可以则调整步长step,并根据步长生成新的输入点,返回执行S22,若不可以,则进入S23。
步骤S23.对步长减半并对其值取反,根据步长选取新输入点,若步长小于给定阈值δ,存取新输入点,执行S25,否则执行S24。
步骤S24.搜索新输入点附近的输入是否能触发精度缺陷,若可以返回执行S23,若不可以对步长减半,根据步长选取新输入点,返回执行S24。
步骤S25.首次执行此步骤,重新选取x作为初始点,并设定初始步长为-step,返回执行S22,否则执行S26。
步骤S26.使用两次存下来的新输入点作为最小输入区间的边界产生能触发精度缺陷的最小输入区间Ierr。
在具体应用实例中,所述步骤S21中计算初始步长的公式是:
step=ulp(x)*j
其中,x是初始输入点,j是一个正整数,本发明使用的默认j值是1000,ulp(x)的计算公式如下:
所述步骤S22和S23中根据步长选取新输入点的具体计算公式是:
x′=x+step
所述步骤S22中调整步长的具体计算公式是:
step=times*step
其中times是[1.5,3.0]之间的一个实数。
所述步骤S23中给定阈值δ大小是:
δ=ulp(x)*100
在具体应用实例中,所述步骤S3的具体步骤为:
步骤S31.线性近似:根据输入区间Ierr的两个端点{xs,xe}产生线性函数。
步骤S32.误差补偿:使用二次函c(x)来近似线性函数和实际数学函数之间的绝对误差函数AbsErr(x)。
步骤S33.迭代精化:线性函数加上二次函数作为数学近似计算其和实际数学函数的输出之间的最大误差,并保存对应输入xnext。如果数学近似和实际数学函数之间最大误差满足精度需求,则存储数学近似到列表,否则,选取xnext作为新的端点,以{xs,xnext}和{xnext,xe}为输入,重新执行S31。
在具体应用实例中,所述步骤S31中线性函数的具体公式是:
其中fl(x)的计算公式是:
fl(x)=k*(x-xs)+f(xs)
所述步骤S32中线性函数和实际数学函数之间的绝对误差函数的具体公式是:
AbsErr(x)=f(x)-l(x)
所述步骤S32中二次函数的具体公式是:
c(x)=λ*(x-xs)(x-xe)
其中,λ=AbsErr(xm)/(xm-xs)(xm-xe),xm=xs+(xe-xs)/2.0是xs和xe之间的中点。
对于步骤S3中使用的线性近似加误差补偿的方法来近似数学函数,使用其它近似方法,比如泰勒展开,替换本发明中使用的近似方法都属于本发明方法的有效变体,其关键点在于从数学函数中获取和浮点程序执行无关的数学近似。
在具体应用实例中,所述步骤S4中补丁生成和优化方法的具体步骤是:
步骤S42.将数学近似列表用一个6元组列表保存。
步骤S43.使用程序数组来保存6元组列表,并使用基于数组构建索引计算函数来进行补丁优化,即对于输入x使用索引计算函数快速找到对应的数组元素,并构建数学近似计算输入对应的输出。
步骤S44.将程序数组和对应的索引计算函数存储为浮点程序对应补丁。
在具体应用实例中,所述步骤S41中6元组具体存储数据是:
<k,λ,xs,xe,ys,ye>
在具体应用实例中,所述步骤S43中构建索引计算函数的具体方法是:
步骤S433.对P(x)取整得到索引计算函数。
在具体应用实例中,所述步骤S5中判断程序输出是否不满足用户精度需求的不等式条件是:
Error(f(x),fp(x))<ε
其中ε是用户给定的程序输出误差上限,如果Error(f(x),fp(x))大于ε则表示输入x触发了精度缺陷,若小于ε则表示程序输出满足用户精度需求。
对于S4中使用的最小二乘法构建索引计算函数,使用其它搜索算法,比如二分搜索方法,替换本发明中索引计算函数都属于本发明方法的有效变体,其关键点在于加快找到输入对应的数学近似,从而加快补丁执行,减少修复后浮点程序的执行时间开销。
在具体应用实例中,所述步骤S5中计算资源包括:修复方法的执行时间,采样点数量和存储开销等。
参见图2,如果想要近似三个点Oi、Oj、Ok,把两个端点连起来构建线性函数l来近似,对于中间点如果线性函数的输出和数学函数之间的输出误差差值(εk)不满足用户的精度需求,则用两个新的线性近似l1,l2来替代l,这样完成了一次迭代,并保证三个点都得到了完美近似(输出误差为0),如果想要近似n个点,那么最多经过2*n-3次迭代,可以完全近似n个点。
综上所述,通过采用上述方案,本发明的特点就在于,一是本发明基于数学近似对由于病态问题引起的精度缺陷进行修复,二是本发明以给定的精度需求为目标,使用迭代精化算法使得修复结果能满足用户给定的任意精度需求。
以上仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,应视为本发明的保护范围。
Claims (10)
1.一种基于数学近似的浮点程序精度缺陷修复方法,其特征在于,步骤包括:
步骤S1.预处理;
步骤S2.定位精度缺陷:使用线性搜索算法查找包含能触发精度缺陷的最小输入区间Ierr;
步骤S3.生成数学近似:使用线性近似加误差补偿的方法来近似浮点程序在最小输入区间Ierr对应的数学函数执行,并使用迭代精化算法来生成满足给定精度需求的数学近似列表;
步骤S4.补丁生成和优化:将生成的数学近似列表转化为浮点程序补丁,然后对补丁执行性能进行优化;
步骤S5.补丁验证:对最小输入区间Ierr进行采样,测试所有采样输入对应的修复后的浮点程序的输出是否满足精度需求,若满足则修复结束,若不满足且分配的计算资源还未耗尽则返回S2重新执行,若计算资源已经耗尽,则返回修复未完成,修复结束。
2.根据权利要求1所述的基于数学近似的浮点程序精度缺陷修复方法,其特征在于,所述步骤S1的步骤包括:
步骤S11.将程序加载至动态重编译框架中;
步骤S12.识别目标程序中的浮点运算指令并替换为高精度运算指令;
步骤S13.完成所有浮点指令的替换,生成目标程序的高精度执行版本。
4.根据权利要求1-3中任意一项所述的基于数学近似的浮点程序精度缺陷修复方法,其特征在于,所述步骤S2使用线性搜索算法的具体步骤为:
步骤S21.从能触发精度缺陷的输入x做为初始点,并设定初始步长step;
步骤S22.根据步长选取新输入点,并搜索新输入点附近的输入是否能触发精度缺陷,若可以则调整步长step,并根据步长生成新的输入点,返回执行S22,若不可以,则进入S23;
步骤S23.对步长减半并对其值取反,根据步长选取新输入点,若步长小于给定阈值δ,存取新输入点,执行S25,否则执行S24;
步骤S24.搜索新输入点附近的输入是否能触发精度缺陷,若可以返回执行S23,若不可以对步长减半,根据步长选取新输入点,返回执行S24;
步骤S25.首次执行此步骤,重新选取x作为初始点,并设定初始步长为-step,返回执行S22,否则执行S26;
步骤S26.使用两次存下来的新输入点作为最小输入区间的边界产生能触发精度缺陷的最小输入区间Ierr。
6.根据权利要求1-3中任意一项所述的基于数学近似的浮点程序精度缺陷修复方法,其特征在于,所述步骤S3的具体步骤为:
步骤S31.线性近似:根据输入区间Ierr的两个端点{xs,xe}产生线性函数l(x) ;
步骤S32.误差补偿:使用二次函数 c(x)来近似线性函数和实际数学函数之间的绝对误差函数AbsErr(x);
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910033498.4A CN109840067B (zh) | 2019-01-14 | 2019-01-14 | 一种基于数学近似的浮点程序精度缺陷修复方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910033498.4A CN109840067B (zh) | 2019-01-14 | 2019-01-14 | 一种基于数学近似的浮点程序精度缺陷修复方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109840067A CN109840067A (zh) | 2019-06-04 |
CN109840067B true CN109840067B (zh) | 2021-04-20 |
Family
ID=66883780
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910033498.4A Active CN109840067B (zh) | 2019-01-14 | 2019-01-14 | 一种基于数学近似的浮点程序精度缺陷修复方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109840067B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104375157A (zh) * | 2014-10-22 | 2015-02-25 | 南京航空航天大学 | 短基线下惯导辅助的北斗单频整周模糊度求解方法 |
CN106528044A (zh) * | 2010-09-24 | 2017-03-22 | 英特尔公司 | 处理器、指令执行方法和计算系统 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8150902B2 (en) * | 2009-06-19 | 2012-04-03 | Singular Computing Llc | Processing with compact arithmetic processing element |
-
2019
- 2019-01-14 CN CN201910033498.4A patent/CN109840067B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106528044A (zh) * | 2010-09-24 | 2017-03-22 | 英特尔公司 | 处理器、指令执行方法和计算系统 |
CN104375157A (zh) * | 2014-10-22 | 2015-02-25 | 南京航空航天大学 | 短基线下惯导辅助的北斗单频整周模糊度求解方法 |
Non-Patent Citations (1)
Title |
---|
高精度可靠浮点计算及舍入误差分析研究;姜浩;《中国博士学位论文全文数据库 基础科学辑》;20150115;A002-61 * |
Also Published As
Publication number | Publication date |
---|---|
CN109840067A (zh) | 2019-06-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Darulova et al. | Towards a compiler for reals | |
US9542176B2 (en) | Predicting software build errors | |
Kim et al. | Constitutive model for reinforcing steel under cyclic loading | |
Cai et al. | Metamodeling for high dimensional design problems by multi-fidelity simulations | |
CN109446731B (zh) | 一种基于abaqus的岩土工程数值模拟方法 | |
Previti et al. | Premise set caching for enumerating minimal correction subsets | |
Fu et al. | Automated backward error analysis for numerical code | |
Baquela et al. | A novel hybrid multi-objective metamodel-based evolutionary optimization algorithm | |
CN109814834B (zh) | 一种基于条件数指导的浮点程序精度缺陷检测方法 | |
CN113326577A (zh) | 考虑多应力比的全寿命与剩余寿命预测方法、系统及应用 | |
Wunderlich et al. | Pushing the limits: How fault tolerance extends the scope of approximate computing | |
CN109840067B (zh) | 一种基于数学近似的浮点程序精度缺陷修复方法 | |
US20240273849A1 (en) | Deformation-based generation of curved meshes | |
CN117744356A (zh) | 一种基于beso的弹塑性等几何拓扑优化方法 | |
Pan et al. | Rating compiler optimizations for automatic performance tuning | |
Radoń | Numerical aspects of application of FORM in node snapping truss structures | |
CN112926147B (zh) | 含缺陷加筋柱壳的后验优化设计方法 | |
Schöll et al. | Applying efficient fault tolerance to enable the preconditioned conjugate gradient solver on approximate computing hardware | |
CN111221248B (zh) | 优化装置及优化装置的控制方法 | |
Cambier et al. | Computational methods for accounting of structural uncertainties, applications to dynamic behavior prediction of piping systems | |
CN114880792A (zh) | 一种基于形变预测的全方位多角度优化方法 | |
Solovyev et al. | Efficient formal verification of bounds of linear programs | |
Kadhim et al. | Mathematical Foundations and Principles Behind These Methods | |
CN112800669B (zh) | 专用加速器中基于概率图模型的多种近似技术误差评估方法 | |
JP7283645B1 (ja) | 予測値補正装置、予測値補正方法及びプログラム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |