函数
<cmath> <ctgmath>

fma

     double fma  (double x     , double y     , double z);      float fmaf (float x      , float y      , float z);long double fmal (long double x, long double y, long double z);
     double fma (double x     , double y     , double z);      float fma (float x      , float y      , float z);long double fma (long double x, long double y, long double z);     double fma (Type1 x      , Type2 y      , Type3 z);       // additional overloads
乘加
返回 x*y+z

该函数计算结果时,不会在任何中间结果中丢失精度。

实现中可能会定义以下宏常量,以表示此函数通常比执行 x*y+z 算术运算提供更高的效率(例如当使用硬件乘加指令时):

描述
FP_FAST_FMA对于 double 类型的参数,其执行速度通常与 x*y+z 一样快或更快。
FP_FAST_FMAF对于 float 类型的参数,其执行速度通常与 x*y+z 一样快或更快。
FP_FAST_FMAL对于 long double 类型的参数,其执行速度通常与 x*y+z 一样快或更快。

头文件 <tgmath.h> 提供了此函数的类型通用宏版本。
此头文件 (<cmath>) 中为其他算术类型 (Type1Type2Type3) 的组合提供了额外的重载:这些重载在计算前会有效地将其参数转换为 double,除非至少有一个参数是 long double 类型(在这种情况下,所有参数都将被转换为 long double)。

参数

x, y
要相乘的值。
z
要相加的值。

返回值

x*y+z 的结果

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* fma example */
#include <stdio.h>      /* printf */
#include <math.h>       /* fma, FP_FAST_FMA */

int main ()
{
  double x,y,z,result;
  x = 10.0, y = 20.0, z = 30.0;

#ifdef FP_FAST_FMA
  result = fma(x,y,z);
#else
  result = x*y+z;
#endif

  printf ("10.0 * 20.0 + 30.0 = %f\n", result);
  return 0;
}

输出

10.0 * 20.0 + 30.0 = 230.000000


另见