共用方式為


fma、 、 fmaffmal

將兩個值相乘,再加第三個值,然後四捨五入結果,同時只會因為中間捨入而失去少量的精確度。

語法

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、 、 fmaffmal <math.h> <cmath>
fma 巨集 <tgmath.h>

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

另請參閱

依字母順序排列的函式參考
remainder、 、 remainderfremainderl
remquo、 、 remquofremquol