fma(a,b,c)等效于a*b+c,但它不舍入中间结果。

您能给我一些避免这种舍入而从中受益的算法示例吗?

这不是显而易见的,因为我们避免的四舍五入取舍比没有加法的四舍五入要容易得多。

最佳答案

碰到一个重要的例子;更一般而言,FMA允许库编写器通过正确舍入有效地实现许多其他浮点运算。

例如,具有FMA的平台可以使用它来实现正确的舍入除法和平方根(PPC和Itanium采用了这种方法),这使得FPU基本上是一台单一用途的FMA机器。如果您好奇的话,Peter Tang和John Harrison(Intel)和Peter Markstein(HP)有一些论文解释了这种用法。

taw给出的示例比仅在跟踪错误范围方面更有用。它允许您将两个浮点数的乘积表示为两个浮点数的总和,而没有任何舍入误差;这对于实现正确舍入的浮点库函数非常有用。让·米歇尔·穆勒(Jean-Michel Muller)的书或有关crlibm的论文将是了解更多有关这些用途的良好起点。

FMA在减少某些类型参数的数学库样式例程中的参数减少方面也广泛有用;当进行参数约简时,计算的目标通常是形式为(x - a*b)的项,其中(a*b)几乎等于x本身;特别是,如果不使用FMA计算结果,则结果通常在(a*b)项中舍入误差。我相信穆勒在他的书中也写了一些有关此的内容。

关于floating-point - 哪些算法从融合乘法加法中受益最大?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3589418/

10-12 17:45