|
数値計算をやっていると、nan や inf が出てくることがあります。 (初めからそんなのが起こらないようにコードを書けというのは却下。すいません。わたし頭悪いです) どこでそれが起こっているのかデバッグライトで探し出すのもいいですが、実行時に SIGFPE を検知してプログラムをストップできれば、特定もしやすいでしょう。 検索するといくつか方法が出てきますが、fpu_control.h で __setfpucw を使うのは、obsolete の様です。さらに調べると、fenv.h を使うのを見つけたので、メモしておきます。詳しくは man fenv してください。 1−次のコードを書く。trapfpe.c 等適当に名前をつけてください。 #define _GNU_SOURCE 1 #include <fenv.h> static void attribute((constructor)) trapfpe () {
feenableexcept (FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW);
}2−これをコンパイルして、自分のプログラムにリンクさせる。-g オプションもつけておく。-lm オプションもつけましょう。(g77 なら -trapfpe が効くかもしれませんが、これも obsolete?) これで、実行時に事が起こればプログラムが止まるようになります。引数を変えれば、検知する状態も変えることができます。詳しくは man fenv で調べて下さい。
|

- >
- コンピュータとインターネット
- >
- コンピュータ
- >
- UNIX



attribute の前後に _ アンダースコアが二ついります。
gfortran だと -ffpe-trap=invalid,zero,overflow,underflow,precision,denormal
くらいかな.
2010/2/1(月) 午後 1:17 [ nanasi ]