2010-11-04 19 views
7
#ifndef INFINITY 
#ifdef _MSC_VER 
    union MSVC_EVIL_FLOAT_HACK 
    { 
     unsigned __int8 Bytes[4]; 
     float Value; 
    }; 
    static union MSVC_EVIL_FLOAT_HACK INFINITY_HACK = {{0x00, 0x00, 0x80, 0x7F}}; 
    #define INFINITY (INFINITY_HACK.Value) 
#endif 

मैं वर्तमान में चिपमंक भौतिकी इंजन के साथ शुरू कर रहा हूँ हो रही है और एक हेडर फाइलयह कोड क्या करता है?

अनंत वस्तुओं के लिए अनंत गति सेट करने के लिए प्रयोग किया जाता है में इस पाया, फिर भी मुझे समझ नहीं आता क्या इस कोड को ऊपर करता है!

उत्तर

6

ऊपर दिया गया कोड प्रभावी रूप से कुछ बहुत विशिष्ट बाइट्स प्रतिनिधित्व के साथ एक फ़्लोटिंग-पॉइंट निरंतर परिभाषित करता है।

हर float बाइट्स की एक सेट के साथ प्रस्तुत किया जाता है, लेकिन जब आप float स्थिरांक को परिभाषित आप दशमलव प्रतिनिधित्व का उपयोग करने के लिए मजबूर कर रहे हैं और मूल्य के साथ एक निरंतर परिभाषित नहीं कर सकते हैं कहते हैं कि 0xFFFFFFFF (यदि है कि लगातार एक है मैं नहीं जानता कानूनी float संख्या)।

उपरोक्त कोड उस सीमा को बाईपास करता है - यह पहले यूनियन के अंदर एक बाइट सरणी सेट करता है और फिर उसी बाइट सरणी को "एक्सेस" करता है जैसे कि यह float नंबर था। वैसे भी यह अवैध है - केवल पहले सेट किए गए यूनियन सदस्य को कानूनी रूप से एक्सेस किया जा सकता है, लेकिन यह उस विशिष्ट कार्यान्वयन पर काम कर सकता है।

15

यह हेक्स बिट्स 0x7f800000 द्वारा प्रतिनिधित्व किए गए फ्लोट मान पर INFINITY सेट करता है, जो +INF है। विजुअल स्टूडियो किसी कारण से इन्फिनिटी परिभाषित नहीं करता है।

+0

इसके अलावा, यह उलटे क्रम में घोषित किया जाता है {0x00, 0x00, 0x80, 0x7F} क्योंकि 86 छोटे-endian उपयोग करता है। – jfs

+2

अपने जवाब में कि '+/- INF' है?'क्योंकि मैं बहुत निश्चित हूं कि बिट पैटर्न सिर्फ '+ Inf' है :-) – paxdiablo

+0

कोई बात नहीं, मैं इसे स्वयं ठीक कर दूंगा। मैं इतने सारे वोट वाले गलत जवाब का पालन नहीं कर सकता :-) – paxdiablo

1

यह फ्लोट वैरिएबल द्वारा 0x7f800000 पर कब्जा कर लिया गया स्मृति प्रारंभ करने का एक तरीका है। जैसा कि @ जिम कहते हैं, यह फ्लोट में + अनंत है।

कोड के लिए मोटे तौर पर बराबर है: (

byte Bytes[4] = { 0x00, 0x00, 0x80, 0x7F }; 
float Value; 
memcpy(&Value, Bytes, 4); 
#define INFINITY_HACK (Value) 

पहले मूल कोड एक संघ है कि आप या तो चार बाइट्स की एक सरणी, या एक ही नाव के रूप में के रूप में स्मृति के चार बाइट्स में हेरफेर करने की अनुमति देता है परिभाषित करता है हम जो मान भी पर चार बाइट्स):

union MSVC_EVIL_FLOAT_HACK 
    { 
     unsigned __int8 Bytes[4]; 
     float Value; 
    }; 

तो यह INFINITY_HACK नामित संघ का एक उदाहरण आवंटित और निर्दिष्ट हेक्स मान .:

करने के लिए अपने Bytes सरणी के मूल्यों सेट
static union MSVC_EVIL_FLOAT_HACK INFINITY_HACK = {{0x00, 0x00, 0x80, 0x7F}}; 

यह नाव मान फ़ील्ड initialising क्योंकि यह भी बाइट सरणी के रूप में ही स्मृति पर है के प्रभाव पड़ता है।

अंत में यह फ्लोट वैल्यू के रूप में INFINITY नामक प्रोप्रोसेसर निरंतर परिभाषित करता है।

2

यह एक परिवर्तनीय INFINITY_HACK बनाते हैं, प्रकार MSVC_EVIL_FLOAT_HACK। यह बाइट्स सरणी को संबंधित हेक्स मानों के मान रखने के लिए सेट करता है। इसके बाद यह उन बाइट्स को एक फ़्लोटिंग-पॉइंट नंबर में परिवर्तित करता है (यूनियन केवल आपको अंतर्निहित मानों में से किसी एक को संदर्भित करके उपयोग करने की अनुमति देता है। औसत यह IEEE-754 Floating-Point Standard का पालन करके INIFITY_HACK बिंदुओं को फ़्लोट करने के लिए डेटा को परिवर्तित कर रहा है (ध्यान दें कि बाइटरी-> फ्लोट रूपांतरण के लिए बाइट्स को विपरीत में लिया जाता है)।

वहाँ एक अच्छी छोटी कैलकुलेटर है कि यह व्याख्या कर सकते हैं यदि आप नहीं जानते कि यह कैसे काम करता है: http://babbage.cs.qc.cuny.edu/IEEE-754/32bit.html (यदि आप 7F800000 दर्ज करते हैं, आप इन्फिनिटी मिल जाएगा, लेकिन दर्ज करने का प्रयास 4048F5C2 (आप 3.14 के करीब मिल जाएगा) This calculator चला जाता है decimal-> हेक्स।

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