#pragma STDC FP_CONTRACT のサンプルコード

注釈

この #pragma はコンパイラの実装依存の挙動をユーザーが制御可能にするために存在します。何か特別な理由が無い限り、結果の精度が低下するだけなので指定しないでください。

注釈

exeGCC では未サポートとなります。

double f1(double x, double y, double z) {
  return x * y + z;
}

#pragma STDC FP_CONTRACT DEFAULT
double f2(double x, double y, double z) {
  return x * y + z;
}

#pragma STDC FP_CONTRACT ON
double f3(double x, double y, double z) {
  return x * y + z;
}

#pragma STDC FP_CONTRACT OFF
double f4(double x, double y, double z) {
  return x * y + z;
}

以下は MSYS2 上で exeClang(RV64) s008 を使用した時の実行結果になります。

$ source /c/GCC4/RV64/s008/setup-rv64gc.sh
$ clang $CLANG_CFLAGS -O2 -Wall -Wextra -S test_pragma_fp_contract.c
$ cat test_pragma_fp_contract.s
...

f1: /* デフォルトは ON */
...
        fmadd.d fa0, fa0, fa1, fa2
...
f2: /* STDC FP_CONTRACT DEFAULT */
...
        fmadd.d fa0, fa0, fa1, fa2
...
f3: /* STDC FP_CONTRACT ON (= DEFAULT) */
        fmadd.d fa0, fa0, fa1, fa2
...
f4: /* STDC FP_CONTRACT OFF */
        fmul.d  fa5, fa0, fa1
        fadd.d  fa0, fa5, fa2
        ret
...

#pragma STDC FP_CONTRACT OFF の時、浮動小数点数演算の縮約が禁止され、必ず 1 回の演算ごとに丸め処理を行います。

無指定時と DEFAULT 時は ON になり、複数の浮動小数点数演算を 1 つの命令に縮約することを許可します。この場合は乗算と除算が FMA(Fused-Multiply-Add)命令に縮約されています。丸め処理は最後に 1 回だけ行われるので、精度が向上する可能性があります。