#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 回だけ行われるので、精度が向上する可能性があります。