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
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應