質問

NaNの起源を見つけるのは難しい場合があります。これは、計算の任意のステップで発生し、伝播するためです。 計算がNaNまたはinfを返したときにC ++プログラムを停止させることは可能ですか?私の意見では、クラッシュが発生し、素晴らしいエラーメッセージが表示されます。

Foo: NaN encoutered at Foo.c:624

このようなことは可能ですか?より良い解決策はありますか? NaNの問題をどのようにデバッグしますか?

編集:精度:LinuxでGCCを使用しています。

役に立ちましたか?

解決

完全に移植可能な方法で行うことはできませんが、多くのプラットフォームには、浮動小数点ステータス制御レジスタにアクセスできるC APIが用意されています。

具体的には、オーバーフローと無効な浮動小数点例外のマスクを解除すると、プログラム内の算術演算でNaNまたは無限大の結果が生成されたときにプロセッサが例外を通知します。

Linuxシステムでは、これでうまくいくはずです:

#include <fenv.h> 
...
feenableexcept(FE_INVALID | FE_OVERFLOW);

これらの例外の1つが通知されたときに診断メッセージを出力したり、実行を継続したりできるように、トラップハンドラの作成を学習することをお勧めします。

他のヒント

はい! IEEE 754準拠のプロセッサを設定して(多かれ少なかれ移植可能)、NaNまたは無限大に遭遇したときに割り込みを生成します。

Googleでこれらのスライド、これは開始点です。 5ページのスライドは、必要なすべての情報をまとめたものです。

私はCの専門家ではありませんが、答えは「いいえ」だと思っています。

  1. これには、すべての浮動小数点計算でこのチェックが必要です。パフォーマンスに大きな影響を与えます。
  2. NaNとInfは悪ではありません。アプリが使用する一部のライブラリで合法的に使用されている可能性があります。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top