2013-06-20 60 views
5

我正在將一個windows程序移植到linux的過程中,並且難以忍受一段特定於msvc的代碼,這些代碼似乎在檢查浮點運算,不精確的結果。我非常不確定如何以可靠的方式實現它。我應該補充一點,在涉及特定於linux的編程和像這些非常低級的操作時,我相當缺乏經驗。在Linux上檢測非正常浮動操作對於x86

具體來說,這給了我麻煩的部分是:

if (_statusfp() & (_SW_INEXACT | _SW_DENORMAL)) 
    { 
    ... portable stuff ... 
    } 

    _clearfp(); 

雖然fenv.h似乎給這兩個清除狀態標誌,檢查不準確標誌的能力,它似乎並沒有在檢查反常標誌方面提供任何幫助。此外,我已經向我建議,gcc可能會處理浮點運算的方式不同,以至於無法實現這段代碼的簡單直接端口。我會很感激這方面的任何幫助。

如果它是相關的,這是用於在性能問題的程序非常繁重的部分嘎吱嘎吱的部分。

編輯:當根據http://en.cppreference.com/w/cpp/numeric/fenv/FE_exceptions生成一個反常規結果時,fenv.h中稱爲FE_UNDERFLOW的標誌似乎會出現,但是有幾個其他來源聲明只有當結果太小時纔會產生,即使是低於正常值。將運行測試,看看它是否也能滿足我的需求,如果有的話也回答自己。

+1

這有幫助嗎? http://stackoverflow.com/questions/16849009/in-the-linux-is-or-not-exists-some-functions-be-similar-to-clearfp-and-stat – doctorlove

回答

0

如問題中所述,似乎fenv.h有一個標誌FE_UNDERFLOW,在某些體系結構中,至少表示一個低於正常/反常規的結果。我自己的測試表明,這似乎是我測試的x86架構上的情況,所以我會繼續前進並使用它,除非提供更好的解決方案。

1

C++ 11是您的選擇嗎?如果是這樣,也許你可以致電std::isnormal的結果,見例如http://en.cppreference.com/w/cpp/numeric/math/isnormal

+0

看起來你可以從Boost中獲得它即使您沒有C++ 11:http://www.boost.org/doc/libs/1_41_0/libs/math/doc/sf_and_dist/html/math_toolkit/utils/fpclass.html –

+0

對不起,此代碼現在還需要爲C++ 03編譯。另外,這個操作似乎檢測是否有矩陣乘法產生任何反常規結果。迭代整個結果矩陣,看看是否有任何值是非規範的將是我唯一的選擇,而且最可能太慢,因爲這首先是速度優化。 –