2010-03-29 10 views
7

में इन्फिनिटी मैं एमएसवीसी ++ का उपयोग कर रहा हूं, और मैं अपने कोड में विशेष मूल्य इन्फिनिटी का उपयोग करना चाहता हूं।एमएसवीसी ++

एमएसवीसी ++ में अनंतता के लिए उपयोग करने के लिए बाइट पैटर्न या निरंतर क्या है?

1.0f/0.0f मान 0 क्यों दिखता है?

#include <stdio.h> 
#include <limits.h> 

int main() 
{ 
    float zero = 0.0f ; 
    float inf = 1.0f/zero ; 

    printf("%f\n", inf) ; // 1.#INF00 
    printf("%x\n", inf) ; // why is this 0? 

    printf("%f\n", zero) ; // 0.000000 
    printf("%x\n", zero) ; // 0 

} 

उत्तर

19

उपयोग numeric_limits:

#include <limits> 

float maxFloat = std::numeric_limits<float>::infinity(); 
+1

साफ! यह कैसे काम करता है? क्या कुछ 'numeric_limits :: अनंतता() 'असाइन करना ठीक है? इन्फिनिटी के लिए बिट पैटर्न क्या है? यह कैसे पता चलता है कि पैटर्न मेरे उदाहरण में स्पष्ट रूप से 0 है? – bobobobo

+1

@bobobobo: जब आप किसी चर के रूप में किसी ऐसे व्यवहार के रूप में व्यवहार करते हैं जो 'printf' में नहीं है, तो अपेक्षा करने के लिए बहुत कुछ नहीं है, यह तोड़ सकता है। मुझे लगता है कि पीटरचेन इसे कवर करता है। – GManNickG

11

printf("%x\n", inf) एक पूर्णांक (MSVC पर 32 बिट) की उम्मीद है, लेकिन एक डबल प्राप्त करता है। Hilarity आ जाएगा। एर, मेरा मतलब है: अपरिभाषित व्यवहार।

(और हां, यह एक परिवर्तनीय तर्क सूची के लिए एक डबल प्राप्त करता है, फ्लोट को दोहराया जाता है)।

वैसे भी संपादित करें, आपको numeric_limits का उपयोग करना चाहिए, जैसा कि अन्य उत्तर भी कहते हैं।

2

यह तब होता है जब आप printf() से झूठ बोलते हैं, यह गलत हो जाता है। जब आप% x प्रारूप विनिर्देशक का उपयोग करते हैं, तो यह अपेक्षा करता है कि एक पूर्णांक को स्टैक पर पारित किया जाए, न कि एफपीयू स्टैक पर पारित फ्लोट। ठीक करें:

printf("%x\n", *(__int32*)&inf) ; 

आप <limits> सी ++ हेडर फाइल से बाहर अनंत प्राप्त कर सकते हैं:

float inf = std::numeric_limits<float>::infinity(). 
3

चर तर्क में printf करने के लिए सूची, तैरता युगल के लिए प्रोत्साहित किया जाता है। डबल के रूप में अनंतता के छोटे-एंडियन बाइट प्रतिनिधित्व 00 00 00 00 00 00 एफ 0 7 एफ है।

जैसा कि पीटरिन ने उल्लेख किया है, "% x" एक इंट की अपेक्षा करता है, डबल नहीं। तो printf तर्क के पहले आकार (int) बाइट्स को देखता है। एमएसवीसी ++ का कोई संस्करण int को 4 बाइट्स से बड़ा नहीं परिभाषित करता है, इसलिए आपको सभी शून्य मिलते हैं।