3

ここに以前に投稿した問題をデバッグしようとしています: C++ と pin ツール - 非常に奇妙な DOUBLE variable issue with IF statement。gdbを使用して、奇妙な動作が発生した瞬間を追跡しました。私が見つけたものは、逆アセンブルされたコードと浮動ポインターレジスター値を表示する gdb スクリーンショットを示す下の図に示されています。(拡大画像はこちら) FLDZ命令実行前後 左側の画像は、強調表示FLDZされた命令が実行される前のスクリーンショットを示し、右側の画像は命令が実行された後のスクリーンショットを示しています。x86 ISA を調べたところ、FLDZにロード+0.0するためのものST(0)です。しかし、私が得るのは-nan代わりに+0.0. なぜこれが起こるのか誰か知っていますか?私が使用しているシステムは、64 ビット CentOS を実行する Intel xeon 5645 ですが、デバッグしようとしているターゲット プログラムは 32 ビット アプリケーションです。また、以前の投稿で述べたように、4.2.4 と 4.1.2 の 2 つのバージョンの gcc を試したところ、同じ問題が発生しました。ありがとう。

--追記-- ちなみに以下がソースコードです。

void Router::Evaluate( )
{
  if (_id == 0) aaa++;

  if ( _partial_internal_cycles != 0 )
  {
    aaa += 12345;
    cout << "this is not a zero : " << endl;
    on = true;
  }

  _partial_internal_cycles += (double) 1.0;

  if ( _partial_internal_cycles >= (double)1.0 ) {
    _InternalStep( );
    _partial_internal_cycles -= (double)1.0;
  }

  if (GetSimTime() > 8646000 && _id == 0) cout << "aaa = " << aaa << endl;
  if ( on)
  {
    cout << "break. id = " << _id << endl;
    assert(false);
  }

}
4

1 に答える 1

3

例外が生成されました(Iビットが統計フィールドに設定されていることに注意してください)。ドキュメントにあるように:

新しいST(0)になるST(7)データレジスタが空でない場合、スタック障害と無効な操作の例外の両方が検出され、ステータスワードに両方のフラグが設定されます。ステータスワードのTOPレジスタポインタは引き続きデクリメントされ、ST(0)の新しい値はINDEFINITENANになります。

ちなみに、根本的な問題は、これが浮動小数点の性質にすぎないためです。正確ではありません。たとえば、このgccバグレポートこれを参照してください。

于 2012-08-08T08:42:22.343 に答える