次の方法で共有


fmafmaffmal

2 つの値を乗算し、3 番目の値を加算した後、結果を丸めますが、中間の丸めによって精度が低下するのはごくわずかです。

構文

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
乗算する 1 番目の値。

y
乗算する 2 番目の値。

z
加算する値。

戻り値

(x * y) + zを返します。 その後、戻り値は現在の丸め形式を使用して丸められますが、多くの場合、正しく丸められた結果が返されるため、正しい値から最大 5 分の 1 の ulp で値が不正確になる可能性があります。

それ以外の場合は、次の値のいずれかを返します。

問題点 Return
x = INFINITY、y = 0 または

x = 0、y = INFINITY
NaN
x または y = ± INFINITY、 z = INFINITY と反対の符号 NaN
x または y = NaN NaN
not (x = 0, y= indefinite) および z = NaN

not (x=indefinite, 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++ ヘッダー
fmafmaffmal <math.h> <cmath>
fma マクロ <tgmath.h>

互換性の詳細については、「 Compatibility」を参照してください。

関連項目

関数リファレンス (アルファベット順)
remainderremainderfremainderl
remquoremquofremquol