4

cmathライブラリに 3 つの数値を指定xyて をz返す関数はありますx*y+zか?

4

1 に答える 1

12

fmaFused Multiply Add の略で、C99 およびC++11で導入されました。

#include <cassert>
#include <cmath>

int main() {
    assert(std::fabs(std::fma(2.0, 3.0, 4.0) - (2.0 * 3.0 + 4.0)) < 0.001);
}

考えられる理由:

  • IEEE 754-2008 では、この操作のサポートが追加されたようで、2 回ではなく 1 回の丸めで実行する必要があります。

    コメントで取り上げてくれた@Lưuに感謝します。

  • ARM や x86などの一部の一般的なアーキテクチャには 1 サイクルの fma 命令があるため、理論的にはアーキテクチャに最適化されたコンパイラ / stdlibs はそれらを使用できます。

    実際に最新のコンパイラがこの最適化をすでに行っているかどうかはわかりません。

    X86 の整数の場合、FMA はすでに LEA 命令で実行できます。イノベーションは double を使用するという事実だと思います。

于 2013-11-05T07:45:50.177 に答える