x86

2013-06-20 5 views
5

के लिए लिनक्स पर डिमॉर्मल फ्लोट ऑपरेशंस का पता लगाना मैं लिनक्स में एक विंडोज़ प्रोग्राम को पोर्ट करने की प्रक्रिया में हूं, और एमएसवीसी-विशिष्ट कोड के टुकड़े पर फंस गया है जो फ्लोटिंग पॉइंट ऑपरेशंस की जांच करता है, जो एक असामान्य या अचूक परिणाम मैं इसे एक मजबूत तरीके से कार्यान्वित करने के बारे में बहुत अनिश्चित हूं। मुझे यह जोड़ना चाहिए कि जब मैं लिनक्स-विशिष्ट प्रोग्रामिंग और इनके जैसे बहुत कम स्तर के संचालन की बात करता हूं तो मैं काफी अनुभवहीन हूं।x86

विशेष रूप से, बात यह है कि मुझे परेशानी देता है निम्नलिखित:

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

    _clearfp(); 

fenv.h दोनों स्थिति झंडा स्पष्ट और अयथार्थ ध्वज के लिए जांच करने की क्षमता देने के लिए लगता है, यह प्रतीत नहीं होता है denormal ध्वज की जांच में कोई सहायता प्रदान करते हैं। इसके अलावा, मैंने यह सुझाव दिया है कि जीसीसी फ्लोटिंग पॉइंट ऑपरेशंस को अलग-अलग संभाल सकता है कि कोड के इस टुकड़े का एक साधारण सीधा बंदरगाह संभव नहीं हो सकता है। मैं इसमें किसी भी सहायता के लिए आभारी रहूंगा।

यदि यह प्रासंगिक है, तो यह प्रोग्राम के बहुत भारी संख्या में क्रंचिंग भाग में उपयोग किया जाता है जहां प्रदर्शन पदार्थ।

संपादित करें: fenv.h में ध्वज को FE_UNDERFLOW कहा जाता है जब http://en.cppreference.com/w/cpp/numeric/fenv/FE_exceptions के अनुसार एक असामान्य परिणाम उत्पन्न होता है, लेकिन कई अन्य स्रोतों ने यह देखा है कि यह तब उठाया जाता है जब परिणाम असामान्य के लिए भी छोटा होता है । यह देखने के लिए परीक्षण चलाएंगे कि क्या मुझे यह भी चाहिए कि मुझे इसकी क्या ज़रूरत है और यदि ऐसा है तो मुझे जवाब दें।

+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

क्या सी ++ 11 आपके लिए एक विकल्प है? यदि ऐसा है, तो शायद आप परिणाम पर std::isnormal पर कॉल कर सकते हैं, उदाहरण के लिए देखें http://en.cppreference.com/w/cpp/numeric/math/isnormal

+0

ऐसा लगता है कि आप इसे बूस्ट से प्राप्त कर सकते हैं भले ही आपके पास सी ++ 11 नहीं है: http://www.boost.org/doc/libs/1_41_0/libs/math/doc/sf_and_dist/html/math_toolkit/utils/fpclass.html –

+0

क्षमा करें, यह कोड आधार अभी भी सी ++ 03 के लिए संकलित करने की जरूरत है। इसके अतिरिक्त, यह ऑपरेशन पता लगाता है कि मैट्रिक्स गुणा से कोई भी असामान्य परिणाम प्राप्त हुआ है या नहीं। पूरे परिणामस्वरूप मैट्रिक्स के माध्यम से यह देखने के लिए कि क्या कोई मान असामान्य है, मेरा एकमात्र विकल्प होगा और अधिकतर धीमी गति से, क्योंकि यह पहली जगह में एक गति अनुकूलन है। –