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 |
x 或 y = 完全± INFINITY, z = 具有相反正負號的 INFINITY |
NaN |
x 或 y = NaN |
NaN |
非 (x = 0、y = 無限制) 和 z = NaN非 ( x =無限制、y =0) 和 z = NaN |
NaN |
溢位範圍錯誤 | HUGE_VAL ±、±HUGE_VALF 或±HUGE_VALL |
反向溢位範圍錯誤 | 四捨五入後的正確值。 |
依 _matherr
中的指定回報錯誤。
備註
因為 C++ 允許多載,所以您可以呼叫採用並傳回 fma
和 float
類型的 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