次のコードを検討してください。
#include <fenv.h>
#include <stdio.h>
int main()
{
#pragma STDC FENV_ACCESS ON
1.0/0.0;
printf("%x\n", fetestexcept(FE_ALL_EXCEPT));
}
に対応するゼロ以外の値を出力することを期待しますが、0 をFE_DIVBYZERO
出力します。 の 2 行目を に変更するとmain
、double x = 1.0/0.0;
期待される動作が得られます。これは許可されていますか、それともバグですか?
編集:最初は、ほとんどの実際のコードでは、fenv 例外が発生する可能性のある操作を最適化できなかったように見えるかもしれません。そのため、大規模な計算を安全に実行し、最後にオーバーフロー、div-by-zero などが発生しました。ただし、インライン化と最適化を検討すると、事態が混乱し、実際の問題が発生します。そのような関数が、定数引数のために常にゼロで除算される状況でインライン化された場合、gcc は非常にスマートになり、インライン化された関数全体を本質的にreturn INFINITY;
例外を発生させずに最適化する可能性があります。