*読書と物理と時々車

ここに有る物はどの一つの例外なく、私のなけなしの知識の無駄遣いである。間違っているとは言わせない。リアル引越し終了。

全体表示

[ リスト ]

FPE を検知する。

数値計算をやっていると、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 で調べて下さい。

閉じる コメント(1)

顔アイコン

attribute の前後に _ アンダースコアが二ついります。

gfortran だと -ffpe-trap=invalid,zero,overflow,underflow,precision,denormal
くらいかな.

2010/2/1(月) 午後 1:17 [ nanasi ]


.
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

過去の記事一覧

れふじ
れふじ
非公開 / 非公開
人気度
Yahoo!ブログヘルプ - ブログ人気度について

ブログバナー

検索 検索

よしもとブログランキング

もっと見る

プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事