C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のfma()関数とは?構文・使い方・精度の特徴を解説

本記事では、C++におけるfma()関数の動作について解説します。fma()関数がどのような引数を受け取り、どのような結果を返すのかを、実際のコード例とともに見ていきましょう。

fma()は<cmath>ヘッダーファイルに定義されている組み込み関数で、3つの引数 x、y、z を受け取り、「x*y+z」の計算結果を返します。最大の特徴は、中間計算の段階で精度を一切落とさない点です。

通常、乗算と加算を別々のステートメントで行うと、乗算の中間結果に対して丸め処理が発生し、誤差が生じる可能性があります。一方、fma()は「融合積和演算(Fused Multiply-Add)」として1回の演算で処理するため、最終的な丸めが1回だけで済み、より正確な結果が得られます。

構文

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

または

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

または

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

引数(パラメータ)

  • x − 乗算の対象となる最初の値です。

  • y − x と掛け合わせる2番目の値です。

  • z − x と y の乗算結果に加算される3番目の値です。

戻り値

この関数は「x*y+z」の正確な計算結果を返します。オーバーフロー時には HUGE_VAL(マクロ)が返されることもあります。

使用例①

#include<iostream>
#include<cmath>
using namespace std;
int main() {
    double x = 2.1, y = 4.2, z = 9.4, answer;
    answer = fma(x, y, z);
    cout << x << " * " << y << " + " << z << " = " << answer << endl;
    return 0;
}

出力

上記のコードを実行すると、次の出力が得られます。

2.1 * 4.2 + 9.4 = 18.22

使用例②

#include<bits/stdc++.h>
using namespace std;
int main() {
    double a = 7.4, b = 9.3, c = 1.2;
    double ans = fma(a, b, c);
    cout << a << " * " << b << " + " << c << " = " << ans << endl;
    return 0;
}

出力

上記のコードを実行すると、次の出力が得られます。

7.4 * 9.3 + 1.2 = 70.02

まとめ

fma()関数は、単純な「a * b + c」という式の代わりに使うことで、丸め誤差を最小限に抑えられる便利な関数です。特に科学技術計算や金融計算など、高い数値精度が求められる場面で威力を発揮します。また、CPUがFMA命令(AVX2など)をサポートしている環境では、ハードウェアレベルで高速に実行できる点も大きなメリットです。

  1. C++のlog()関数とは?自然対数を求める方法をわかりやすく解説

    C++の標準ライブラリには、数学的な計算を行うための便利な関数が多数用意されています。その中でもlog()関数は、数値の自然対数(ネイピア数 e を底とする対数)を求めるために使用される重要な関数です。log()関数の基本情報C/C++のライブラリ関数 double log(double x) は、引数 x の自然対数(底が e の対数)を返します。この関数を使用するには、ヘッダーファイル <cmath> をインクルードする必要があります。関数の宣言double log(double x)パラメータと戻り値パラメータ: x は浮動小数点型(double)の値です。自然対数を求めたい

  2. C++のswap()関数とは?2つの変数の値を入れ替える方法をサンプルコード付きで解説

    swap()関数とは C++のswap()関数は、2つの値を入れ替える(交換する)ための関数です。この関数を利用すれば、一時的な第三の変数を自分で用意することなく、2つの変数の値を簡単に入れ替えることができます。 swap()関数の構文 void swap(int variable_name1, int variable_name2); 変数に値を代入してswap()関数に渡した場合、関数内では値の入れ替えが行われますが、呼び出し元の実際の変数の値は変わりません。これは、引数が「値渡し」で渡されるためです。実際の変数の値を入れ替えたい場合は、後述する「参照渡し」を使用します。 例1:s