2013-02-20 90 views
5

में नैन और इंफ को पकड़ें मैंने आज दर्द से सीखा कि नैन और इंफ गंभीर पक्ष समस्याएं हैं। क्या आप उदाहरण के लिए जानते हैं कि sqrtf (NaN) से 15 गुना धीमा और sqrtf (-1) sqrtf (10.123132) से 30 गुना धीमी (!!) है - जो कि अपने स्वयं के धीमे, फ़्लोटिंग से है बिंदु गणना !? आप बकवास की गणना करते हैं, इसके लिए हास्यास्पद मात्रा की आवश्यकता होती है और इसे महसूस भी नहीं करते हैं।विंडोज सी ++

ठीक है, लिनक्स के तहत आप एक अपवाद फेंक कर नेन और Inf कीड़े पकड़ कर सकते हैं जब वे होते हैं:

#include <fenv.h> 
feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW); 

आपको लगता है कि कैसे प्राप्त कर सकता है Windows के तहत?

संपादित करें: बेंचमार्किंग कोड:

float a,b; 
a = 1.0/0; //inf 
a = -10;   //also nice 
long c=0; 
long time = SDL_GetTicks(); 

for (long i=1;i<=1000000;i++) { 
    b=sqrt(a); 
} 

ostringstream Help; Help << SDL_GetTicks()-time; 

//RESULT SHEET 
//sqrt(1): 21ms 
//sqrt(10): 21ms 
//sqrt(10.123): 20ms 
//sqrt(-10); 390ms 
//sqrt(+-NaN): 174ms 
//sqrt(inf): 174 
+1

आपने उस समय को कैसे माप लिया? शायद अपवाद छुपाए जाने के बजाय आपको केवल घटना को रोकना चाहिए? –

+1

मूल्य की जांच करने के लिए 'isinf()' और 'isnan()' का उपयोग करें? http://msdn.microsoft.com/en-us/library/hh308344.aspx –

+3

आप _controlfp() –

उत्तर

5

आप दृश्य स्टूडियो का उपयोग कर रहे हैं, तो आप चल /fp:except विकल्प का उपयोग बिंदु अपवाद चालू कर सकते हैं। http://msdn.microsoft.com/en-us/library/e7s85ffb.aspx देखें।

कोड में समतुल्य #pragma float_control(except, on) है। http://msdn.microsoft.com/en-us/library/45ec64h6(v=vs.110).aspx देखें।

रनटाइम पर आप _controlfp(_MCW_EM, _MCW_EM) जैसे कुछ का उपयोग कर सकते हैं। http://msdn.microsoft.com/en-us/library/vstudio/e9b52ceh(v=vs.110).aspx देखें।

+0

मैं एक मूल संपादक (गेनी इत्यादि) का उपयोग करना चाहता हूं - _controlfp वादा करता है। इसके लिए आवश्यक पुस्तकालय लिंक? – Kenobi

+0

मुझे विश्वास है कि यह सीआरटी का हिस्सा है। कोशिश करना और देखना आसान होना चाहिए। –