Geo*_*off 8 algorithm floating-point rounding-error
我刚刚遇到了Kahan(或补偿)求和算法,用于最小化舍入,我想知道是否有等效的除法和/或乘法算法,以及减法(如果恰好有一个,我知道关于结社).任何语言,伪代码或链接的实现示例都会很棒!
谢谢
减法通常通过Kahan方法处理.
对于乘法,有一些算法可以将两个浮点数的乘积转换为两个浮点数的总和而不进行舍入,此时您可以使用Kahan求和或其他方法,具体取决于您下一步需要做什么产品.
如果您有FMA(融合乘法 - 加法)可用,这可以很容易地完成如下:
p = a*b;
r = fma(a,b,-p);
Run Code Online (Sandbox Code Playgroud)
在这两个操作之后,如果没有发生上溢或下溢,p + r则完全等于a * b没有舍入.这也可以在没有FMA的情况下完成,但是更加困难.如果您对这些算法感兴趣,可以先下载crlibm 文档,其中详细介绍了其中的几个.
分部......好吧,分工最好避免.分工很慢,补偿分工甚至更慢.你可以做到这一点,但如果没有FMA,它就会非常难以实现,并且非常重要.最好设计您的算法以尽可能避免它.
请注意,所有这一切都很快成为一场失败的战斗.有一个非常狭窄的情况,这些技巧是有益的 - 对于任何更复杂的,使用像mpfr这样的更精确的浮点库更好.除非你是该领域的专家(或想成为一名专家),否则通常最好只学会使用这样的库.
| 归档时间: |
|
| 查看次数: |
2287 次 |
| 最近记录: |