2012-08-08 112 views
3

我想調試我在此處發佈的問題: C++ and pin tool -- very weird DOUBLE variable issue with IF statement。 我追蹤了使用gdb發生奇怪行爲的時刻。下圖顯示了我發現的內容,它顯示了顯示反彙編代碼和浮點指針寄存器值的gdb屏幕截圖。 (放大圖像herebefore and after FLDZ instruction is executed 左側的圖像顯示在突出顯示的FLDZ指令執行之前的屏幕截圖,右側圖像在指令執行之後。我查找了x86 ISA,FLDZ用於將+0.0加載到ST(0)中。但是,我得到的是-nan而不是+0.0。 有誰知道爲什麼會發生這種情況? 我使用的系統是運行64位CentOS的Intel xeon 5645,但我試圖調試的目標程序是32位應用程序。另外,正如我在前面的文章中提到的,我嘗試了兩個版本的gcc,4.2.4和4.1.2,並觀察到同樣的問題。 謝謝。浮點指令異常 - FLDZ故障?

- 添加 - 順便說一下,下面是源代碼。

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); 
    } 

} 
+0

看起來像一個FPU堆棧溢出。你有源代碼嗎? – 2012-08-08 08:46:14

+0

看起來像'if(_partial_internal_cycles!= 0)'時出錯。您的FPU堆棧在此時已滿。你需要以某種方式理解這可以如何。我熟悉的編譯器在完成計算後將清空FPU堆棧。你正在使用哪種編譯器? – 2012-08-08 08:58:55

+0

我同意你提出錯誤的地方。另外,我使用了gcc 4.2.4。 – ray 2012-08-08 09:04:05

回答

3

生成了異常(注意I位被設置在stat字段)。作爲the documentation說:

如果這將成爲新的ST的ST(7)數據寄存器(0)不是空的,既是一個堆棧錯誤和無效操作異常檢測,狀態字設置這兩個標誌。狀態字中的TOP寄存器指針仍然會遞減,並且ST(0)中的新值將是INDEFINITE NAN。

順便說一下,你的潛在問題是因爲這只是浮點的本質。這不是確切的。例如參見this gcc bug reportthis one

+0

「順便說一下,你的潛在問題是因爲這只是浮點的本質,它不是精確。」這是事實,但與其他問題無關。 – 2012-08-08 08:54:27

+0

它是。比較結果取決於精度。 – 2012-08-08 09:10:44

+0

'x == 0'每次評估時都會返回相同的值,只要'x'沒有改變。浮點算術實際上是不精確的,但在這個問題中沒有算術。 – 2012-08-08 09:12:04