2016-06-09 8 views
7

कैसे जांचें कि कोई फ़्लोट नंबर सही संख्या है या नहीं? यही कारण है: यह अनंत, नकारात्मक अनन्तता, NaN नहीं है ...सी ++ में एक फ्लोट एक वास्तविक संख्या है या नहीं?

float f; 
??? 
+2

आपका मतलब है ['std :: isnan'] (http://en.cppreference.com/w/cpp/numeric/math/isnan) जैसे कार्य? वह सी ++ 11 है लेकिन नौकरी करता है। – tadman

+2

क्या आपने [std :: isfinite] देखा है (http://en.cppreference.com/w/cpp/numeric/math/isfinite) और संबंधित फ़ंक्शंस? –

+0

आपका मतलब * असली * संख्या है?चूंकि यह संख्या सच है यदि यह 0.0 –

उत्तर

7

std::fpclassify() से सरल std::isfinite()

निर्धारित करता है कि दिए गए फ्लोटिंग बिंदु संख्या आर्ग परिमित मूल्य अर्थात है यह, सामान्य सामान्य से कम या शून्य, लेकिन नहीं अनंत या NaN है उपयोग करने के लिए है।

5

std::isnormal() आप क्या चाहते हैं लेकिन यह भी 0.0 के लिए जाँच करता है। तो तुम उस मामले की जाँच कर सकते अतिरिक्त:

float f; 
bool isNumber = (std::isnormal(f) || f == 0.0); 

संपादित करें: के रूप में user2079303 isnormal द्वारा बताया यह भी एक subnormal number जो ओ पी शायद नहीं चाहता है के लिए झूठी देता है।

हालांकि, शायद std::isfinite सही बात करता है।

float f; 
bool isNumber = std::isfinite(f) ; 

यह रिटर्न NaN और Inf के लिए false

+3

मुझे नहीं लगता कि आप यहां '&&' चाहते हैं। –

+0

@ एनएम। बिल्कुल नहीं .. धन्यवाद – user463035818

+3

क्या आप वाकई ओपी के लिए उपनाम "* सत्य *" संख्या नहीं हैं? – user2079303

1

सी ++ 11 और उसके बाद, !std::isnan(f) && !std::isinf(f) का उपयोग करने के लिए न तो नैन और न ही अनंत (सकारात्मक या नकारात्मक) होने के लिए परीक्षण करें।

प्री-सी ++ 11 यह थोड़ा और कठिन है, लेकिन आप अभी भी इसे कर सकते हैं। अपने मंच float के लिए IEEE754 का उपयोग करता है, तो आप उपयोग कर सकते हैं:

  1. f == f NaN मामले के लिए falseकेवल हो जाएगा। प्रपत्र f == f/2 की

  2. कुछ trueकेवल अनंत या कोई संख्या शून्य के करीब के लिए हो जाएगा, और आप तुच्छता से उत्तरार्द्ध मामले को खत्म कर सकते हैं।

बूस्ट (www.boost.org) पूर्व सी ++ 11 के लिए विधियां भी प्रदान करता है। http://www.boost.org/doc/libs/1_41_0/libs/math/doc/sf_and_dist/html/math_toolkit/utils/fpclass.html

+0

'इस्नान' '' – user463035818

+1

के लिए झूठा रिटर्न देता है आपको शायद पूर्व-सी का उल्लेख करना चाहिए आईईईई -754 द्वारा ++ 11 विधियों की गारंटी है लेकिन सी ++ मानक द्वारा नहीं। – user2079303

1

std::fpclassify() ऐसा लगता है कि आप क्या देख रहे हैं।

int fpclassify(float arg); 
int fpclassify(double arg); 
int fpclassify(long double arg); 
int fpclassify(Integral arg); 

वापसी मान

FP_INFINITE में से एक, FP_NAN, FP_NORMAL, FP_SUBNORMAL, FP_ZERO या कार्यान्वयन से परिभाषित प्रकार, arg की श्रेणी का उल्लेख।

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