4

NaN は計算のどの段階でも発生し、それ自体が伝播する可能性があるため、その発生源を見つけるのは困難な場合がよくあります。では、計算が NaN または inf を返したときに C++ プログラムを停止させることは可能ですか? 私の意見では、素敵なエラーメッセージでクラッシュするのが最善です:

Foo: NaN encoutered at Foo.c:624

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

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

4

3 に答える 3

7

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

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

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

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

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

于 2009-11-27T15:53:22.303 に答える
2

はい!NaN または無限が検出されたときに割り込みを生成するように、IEEE 754 準拠のプロセッサを設定します (多かれ少なかれ移植性があります)。

私はググってこれらのスライドを見つけました。これがスタートです。5 ページのスライドには、必要なすべての情報が要約されています。

于 2009-11-27T15:50:35.853 に答える
0

私は C の専門家ではありませんが、答えはノーだと思います。

  1. これには、すべての float 計算でこのチェックが必要になります。パフォーマンスへの大きな影響。
  2. NaN と Inf は悪ではありません。アプリが使用する一部のライブラリで合法的に使用され、それを壊す可能性があります。
于 2009-11-27T15:44:37.473 に答える