Share via


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>

如需相容性詳細資訊,請參閱相容性

另請參閱

字母函數參考
remainder, remainderf, remainderl
remquo, remquof, remquol