Math 如何优化浮点除法结果的结果?

Math 如何优化浮点除法结果的结果?,math,floating-point,division,ieee-754,Math,Floating Point,Division,Ieee 754,我有一个使用牛顿-拉斐逊算法计算浮点平方根除法的算法。我的结果不完全准确,有时偏离1 ulp 我想知道是否有一种改进的浮点除法算法来获得最终的精度位。我对平方根使用塔克曼检验,但是除法有类似的算法吗?或者塔克曼测试是否可以适用于除法 我也尝试过使用这种算法,但没有得到完全准确的结果: z= divisor r_temp = divisor*q r = dividend - r_temp result_temp = r*z q + result_temp 正确舍入迭代除法结果的一种实用方法是,

我有一个使用牛顿-拉斐逊算法计算浮点平方根除法的算法。我的结果不完全准确,有时偏离1 ulp

我想知道是否有一种改进的浮点除法算法来获得最终的精度位。我对平方根使用塔克曼检验,但是除法有类似的算法吗?或者塔克曼测试是否可以适用于除法

我也尝试过使用这种算法,但没有得到完全准确的结果:

z= divisor
r_temp = divisor*q
 r = dividend - r_temp
result_temp = r*z
q + result_temp

正确舍入迭代除法结果的一种实用方法是,在数学结果的一个ulp内生成一个初步商,然后使用精确计算的残差计算最终结果

精确计算残差的首选工具是融合乘加(FMA)运算。这种方法的许多基础工作(无论是在数学方面还是在实际实现方面)都归功于Peter Markstein,后来被其他研究人员改进。马克斯坦的研究结果在他的书中得到了很好的总结:

Peter Markstein,IA-64和基本函数:速度和精度。普伦蒂斯大厅2000

使用Markstein方法进行正确舍入除法的一种简单方法是,首先计算正确舍入的倒数,然后将其与 股息,然后是最后的基于残差的四舍五入步骤

残差可以直接用于计算最终的四舍五入结果,如下面代码中的商四舍五入所示(我注意到此代码序列导致1011个除法中的一个除法的四舍五入结果不正确,并将其替换为另一个比较和选择习惯用法的实例)这是Markstein使用的技术。或者,它也可以用作双边比较和选择过程的一部分,类似于Tuckerman舍入,如下面代码中的倒数舍入所示

关于倒数计算,有一个警告。许多常用的迭代方法(包括我在下面使用的方法)与Markstein的舍入技术相结合时,如果除数的尾数完全由1位组成,则会产生错误的结果

解决这个问题的一个办法是专门处理这个病例。在下面的代码中,我选择了双边比较和选择方法,这也允许在取整之前误差略大于一个ulp,因此无需在交互迭代本身中使用FMA

请注意,我在下面的C代码中省略了对次正常结果的处理,以保持代码简洁易懂。我只使用标准的C库函数来执行诸如提取部分浮点操作数、汇编浮点数以及应用一个ulp递增和递减等任务。大多数平台将提供具有更高性能的特定于机器的选项

float my_divf(浮点a、浮点b)
{
浮点数q,r,ma,mb,e,s,t;
int ia,ib;
如果(!isnanf(a+b)&&&!isinff(a)&&&!isinff(b)&&(b!=0.0f)){
/*正常情况:删除符号,将参数拆分为指数和尾数*/
ma=frexpf(fabsf(a)和ia);
mb=frexpf(fabsf(b)和ib);
/*[0.5,1]中mb的极小极大多项式逼近为1/mb*/
r=-3.549341e+0f;
r=r*mb+1.06481802e+1f;
r=r*mb-1.17573657e+1f;
r=r*mb+5.65684575e+0f;
/*应用一次三次收敛迭代*/
e=1.0f-mb*r;
e=e*e+e;
r=e*r+r;
/*四舍五入倒数到最近或偶数*/
e=fmaf(-mb,r,1.0f);//第一个候选者的残差
s=nextafterf(r,copysignf(2.0f,e));//凹凸或凹痕
t=fmaf(-mb,s,1.0f);//第二个候选者的残差
r=(fabsf(e)
有一种基于FMA(融合乘加)的浮点除法结果四舍五入算法,但从您之前的问题来看,我认为这对您没有用,因为您的平台没有提供FMA?作者:1993年的Alan H.Karp和Peter Markstein,他们说:按照最初的公式,塔克曼舍入只能用于平方根,不能用于除法。"您是否尝试过文献搜索,例如通过Google Scholar?以下文章可能很有用,因为它不假设FMA可用:。由于我没有FMA,是否仍有可能得到正确的结果?在搜索过程中使用舍入到零或类似的方法。@starbox:您可能想看看我前面提到的文章,然后再看看我不确定你的背景是什么:如果你在生产中需要这个功能