2010-05-31 4 views
16

क्या एसआईजीएफपीई को फेंकने के लिए जीसीसी को बताने का कोई तरीका है याया (-)inf रनटाइम पर परिणामस्वरूप, जैसे कि यह विभाजित-शून्य-शून्य के लिए होगा?क्या मैं जीसीसी को बता सकता हूं जब गणना के परिणाम NaN या inf में रनटाइम पर होते हैं?

मैंने -fsignaling-nans ध्वज की कोशिश की है, जो मदद नहीं करता है।

+1

'-fsignaling-nans' क्रम है, समय संकलन नहीं। – LiraNuna

+2

आप किस प्रणाली पर हैं? –

उत्तर

20

लगभग किसी भी फ़्लोटिंग-पॉइंट ऑपरेशन या गणित लाइब्रेरी फ़ंक्शन जो गैर-NaN इनपुट से NaN उत्पन्न करता है, को 'अमान्य ऑपरेशन' फ़्लोटिंग-पॉइंट अपवाद को भी संकेत देना चाहिए; इसी तरह, एक गणना जो परिमित इनपुट से अनंतता उत्पन्न करती है, आमतौर पर 'विभाजित-शून्य-शून्य' या 'अतिप्रवाह' फ़्लोटिंग-पॉइंट अपवाद को सिग्नल करेगी। तो आप इन अपवादों को एक SIGFPE में बदलने का कोई तरीका चाहते हैं।

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

#define _GNU_SOURCE 
#include <fenv.h> 

int main(void) { 
    double x, y, z; 
    feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW); 

    x = 1e300; 
    y = 1e300; 
    z = x * y; /* should cause an FPE */ 

    return 0; 
} 

एक चेतावनी: मुझे लगता है यह कुछ सेटअप है कि अपवाद वास्तव में उत्पन्न नहीं कर रहा है के साथ संभव है कि (सिद्धांत में) यह कारण हो जाना चाहिए था एक के बाद अगले फ्लोटिंग प्वाइंट आपरेशन है, तो आप कभी कभी जब तक अपवाद को ट्रिगर करने के लिए नो-ऑप फ़्लोटिंग-पॉइंट ऑपरेशन (जैसे 1.0 द्वारा गुणा) की आवश्यकता है।

4

MinGW 4.8.1 (Win32 के लिए जीसीसी) पर मुझे लगता है कि feenableexcept परिभाषित नहीं है। तरीके का उपयोग करने के लिए है Win32 मंच के _controlfp इस प्रकार:

#undef __STRICT_ANSI__ // _controlfp is a non-standard function documented in MSDN 
#include <float.h> 
#include <stdio.h> 

int main() 
{ 
    _clearfp(); 
    unsigned unused_current_word = 0; 
    // clearing the bits unmasks (throws) the exception 
    _controlfp_s(&unused_current_word, 0, _EM_OVERFLOW | _EM_ZERODIVIDE); // _controlfp_s is the secure version of _controlfp 

    float num = 1.0f, den = 0.0f; 
    float quo = num/den; 
    printf("%.8f\n", quo); // the control should never reach here, due to the exception thrown above 
} 
+0

यह मिनीजीडब्ल्यू 4.6.2 पर काम नहीं कर रहा है ('_clearfp()' इस दायरे में घोषित नहीं किया गया था) – Antonello

संबंधित मुद्दे

 संबंधित मुद्दे