26

क्या विजुअल स्टूडियो (केवल 2008 से 2010 तक अपग्रेड किया गया) को तोड़ने के लिए कोई तरीका है, जैसे कि कोई दावा विफल हुआ, जब भी कोई फ़्लोटिंग पॉइंट नंबर NaN बन जाता है, क्यूएनएएन, आईएनएफ, आदि?विजुअल स्टूडियो सी ++ 2008/2010 - फ्लोट पर ब्रेक NaN

अब तक मैं अभी तक जोर (x == x) चाल का उपयोग कर रहा हूं, लेकिन मैं कुछ अंतर्निहित हूं, इसलिए मुझे हर जगह दावा जोड़ने की ज़रूरत नहीं है।

काफी आश्चर्यचकित है कि मुझे Google के माध्यम से इसका कोई जवाब नहीं मिल रहा है। 'फ्लोटिंग पॉइंट अपवाद' के बारे में कुछ सामान, लेकिन मुझे यकीन नहीं है कि वे एक ही चीज़ हैं, और मैंने उन्हें विजुअल स्टूडियो में सक्षम करने का प्रयास किया है, लेकिन प्रोग्राम तब तक नहीं टूटता जब तक नाक के कारण कुछ विनाशकारी नहीं होता निष्पादन में

उत्तर

30

1) विकल्प परियोजना और /fp सक्षम पर जाएँ: सख्त (C/C++ -> कोड पीढ़ी -> फ्लोटिंग पिंट मॉडल)।

2) फ़्लोटिंग-पॉइंट कंट्रोल शब्द सेट करने के लिए _controlfp का उपयोग करें (नीचे कोड देखें)।

#include <float.h> 
unsigned int fp_control_state = _controlfp(_EM_INEXACT, _MCW_EM); 

#include <math.h> 

int main() { 

    sqrtf(-1.0); // floating point exception 

    double x = 0.0; 
    double y = 1.0/x; // floating point exception 

    return 0; 
} 
+0

सर्वश्रेष्ठ और सबसे व्यापक उत्तर, चीयर्स। – Dave

+0

क्या यह _EM_INVALID नहीं होगा? – ponce

+0

@ponce। यह भी काम करता है। यह _EM_INEXACT से बेहतर हो सकता है। – watson1180

0

मुझे यकीन नहीं है कि यह संभव है कि आप इसे कैसे चाहते हैं, लेकिन आप एक मैक्रो बना सकते हैं जो चिह्नित रेखा में कोड को एक जोर में लपेटता है या इसके लिए ब्रेकपॉइंट सेट करता है।

आशा इस

+0

मुझे यकीन नहीं है कि इसका मतलब क्या है। ऐसा लगता है कि आप जोरदार बयान जोड़ना चाहते हैं लेकिन इसे मैक्रो में लपेटें? यह कैसे मदद करता है? – Dave

1

कम से कम 86 पर मदद करता है, जब आप एक NaN आदि, एफपीयू स्थिति रजिस्टर बिट्स में से एक सेट है उत्पन्न करते हैं। एक तरीका है जिसे आप सेट कर सकते हैं ताकि पर एच/डब्ल्यू अपवाद फेंकने के बाद अगले एफपी ऑपरेशन होता है, लेकिन यह उतनी जल्दी नहीं है जितनी आप उम्मीद करते हैं। हालांकि मैं संदर्भ को याद नहीं कर सकता।

+0

ऐसा करने का तरीका खोजने का प्रयास कर रहा है। फ्लोटिंग पॉइंट अपवादों के लिए "कोड जेनरेशन" के तहत विजुअल स्टूडियो में मुझे बस इतना ही विकल्प मिल सकता है। हालांकि, अपवादों को सक्षम करने से कोई प्रभाव नहीं पड़ता है। – Dave

+1

watson1180 के उत्तर और यह देखें: http://stackoverflow.com/questions/2769814/how-do-i-use-try-catch-to-catch-floating-point-errors/2769889#2769889 – George

4

प्रयास करें enabling fp exceptions

+0

ठीक है, _clearfp जोड़ा गया है और _controlfp कमांड, साथ ही विजुअल स्टूडियो मेनू विकल्प। अभी भी अपवाद नहीं मिल रहे हैं, लेकिन मुझे लगता है कि यह एक अलग समस्या है क्योंकि मूल्य QNAN हैं, जो ऐसा लगता है कि अपवाद नहीं उठाते हैं। मैं इससे संबंधित एक नया सवाल शुरू करूंगा। – Dave

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