fma, fmaf, fmal

将两个值相乘,再加上第三个值,然后对结果进行四舍五入,而由于中间取整,只会损失少量精度。

语法

double fma(
   double x,
   double y,
   double z
);

float fma(
   float  x,
   float  y,
   float z
); //C++ only

long double fma(
   long double  x,
   long double  y,
   long double z
); //C++ only

float fmaf(
   float  x,
   float  y,
   float z
);

long double fmal(
   long double  x,
   long double  y,
   long double z
);

#define fma(X, Y, Z) // Requires C11 or higher

参数

x
要相乘的第一个值。

y
要相乘的第二个值。

z
要相加的值。

返回值

返回大约 (x * y) + z。 然后使用当前舍入格式对返回值进行舍入,尽管在许多情况下,返回的舍入结果不正确,因此该值可能与正确值相差半个 ulp。

否则,可能返回以下值之一:

问题 返回值
x = INFINITY、y = 0 或

x = -0、y = INFINITY
NaN
xy = 精确 ± INFINITY,z = 具有相反符号的 INFINITY NaN
xy = NaN NaN
非(x = 0,y= 不定值)和 z = NaN

非(x= 不定值,y= 0)和 z = NaN
NaN
溢出范围错误 ±HUGE_VAL、±HUGE_VALF 或 ±HUGE_VALL
下溢范围错误 舍入后的正确值。

_matherr 中所指定的内容报告错误。

备注

由于 C++ 支持重载,您可以调用采用并返回 fmafloat 类型的 long double 的重载。 在 C 程序中,除非使用 <tgmath.h> 宏调用此函数,否则 fma 始终采用并返回 double

如果使用 <tgmath.h>fma() 宏,则参数的类型将决定选择哪个版本的函数。 有关详细信息,请参阅泛型类型数学

此函数计算值就好像它采取了无限精度,然后将最终结果舍入。

默认情况下,此函数的全局状态范围限定为应用程序。 若要更改此行为,请参阅 CRT 中的全局状态

要求

函数 C 标头 C++ 标头
fma, fmaf, fmal <math.h> <cmath>
fma <tgmath.h>

有关兼容性的详细信息,请参阅 兼容性

另请参阅

按字母顺序显示的函数参考
remainderremainderfremainderl
remquoremquofremquol