EN JA
FMA(3)
FMA(3) FreeBSD Library Functions Manual FMA(3)

名称

fma, fmaf, fmal融合乗加算

ライブラリ

Math Library (libm, -lm)

書式

#include < math.h>

double
fma( double x, double y, double z);

float
fmaf( float x, float y, float z);

long double
fmal( long double x, long double y, long double z);

解説

fma(), fmaf() と fmal() 関数は 1 つの丸め誤差だけで計算された (x * y) + z を返します。普通の乗法と加算演算子を使用すると、それに反して、 2 つの丸めの結果となります: 1 つは中間生成物と 1 つは最終結果です。

例えば、式 1.2e100 * 2.0e208 - 1.4e308 は中間生成物でオーバフローのために無限 (infinity) を生成しますが、 fma(1.2e100, 2.0e208, -1.4e308) は約 1.0e308 を返します。

融合乗加算操作は、ドット製品 (dot products) のように計算の精度を改良するためにしばしば使用されます。また、それは、固有ににそれを実装するマシンで性能を向上させるために使用されるかもしれません。マクロの FP_FAST_FMA, FP_FAST_FMAFFP_FAST_FMALfma(), fmaf() と fmal() が (それぞれ) 乗算操作に続いて加算操作より比較できるかまたは速い速度があることを示しますが、 < math.h> で定義されます。

実装に関する注

一般的に、これらのルーチンは x * y + z が限りない精度と範囲で計算されるなら、期待されるように振る舞い、次に、リターンタイプの精度を丸めます。しかしながら、いくつかのプラットフォームでは、 z が NaN であるなら、 x * y の計算が無効の例外を発生するときでさえ、これらの関数は例外を上げません。

関連項目

fenv(3), math(3)

規格

fma(), fmaf() と fmal() 関数は、 ISO/IEC 9899:1999 (“ISO C99”) に適合しています。仮想識別指標がある融合乗加算操作は IEEE 草稿規格 754R に登場しました。

歴史

fma() と fmaf() ルーチンは、 FreeBSD 5.4 ではじめて登場し、 fmal() は、 FreeBSD 6.0 で登場しました。
January 22, 2005 FreeBSD