अवास्तविक में, C ++ के फ्लोट और FFloat32 के बीच क्या अंतर हैं?


17

मैं UE4 के कुछ गहरे पहलुओं को सीखने की कोशिश कर रहा हूं और कई उदाहरण कोड और इंजन के स्रोत आधार को पढ़ते हुए, मैंने देखा कि कभी-कभी लोग (और बहुत स्रोत कोड) मानक C ++ floatआदिम का उपयोग करते हैं, लेकिन कभी-कभी UE4 के कस्टम कार्यान्वयन का उपयोग करते हैं FFloat32

तब मुझे उत्सुकता हुई: जब अवास्तविक के साथ एक गेम प्रोग्रामिंग करते हैं, तो उन 2 विकल्पों का उपयोग करने के बीच क्या अंतर हैं और संभवतः मुख्य मामले क्या हैं जब किसी को इंजन के कार्यान्वयन के पक्ष में मानक C ++ आदिम को छोड़ देना चाहिए?


1
मुझे आपके द्वारा पाए गए उदाहरणों को पढ़ने में दिलचस्पी होगी जो वास्तव में उपयोग करते हैं FFloat32

@JoshPetrie उनमें से कुछ ऑफ-लाइन थे, एक युगल ऑनलाइन थे। जैसे ही मेरे पास घर पर समय होगा, मैं उन्हें साझा करने के लिए खोज करूँगा
किम शटर

जवाबों:


17

float, ठीक है, एक C ++ फ्लोटिंग पॉइंट है। FFloat32एक ऐसी संरचना है जो फ्लोट के साथ-साथ (एक यूनियन के माध्यम से) उस फ्लोट के संकेत, मंटिसा और एक्सपोनेंट भागों के विघटित बिटफ़िल्ड का प्रतिनिधित्व करती है।

आपको आम तौर पर कभी नहीं करना चाहिए का उपयोग करें FFloat32जब छोड़कर:

  • आप कुछ एपीआई का उपयोग कर रहे हैं जो उम्मीद FFloat32करते हैं कि (ये बहुत दुर्लभ हैं) या
  • आपको फ्लोटिंग पॉइंट वैल्यू के साथ निम्न स्तर की बिट हैकरी करने की आवश्यकता है (इन दिनों भी काफी दुर्लभ)

ऐसा नहीं FFloat32है बुरा , दर असल, यह सिर्फ है कि यह वास्तव में आप कुछ भी आप सामान्य प्रयोजन चल बिन्दु के उपयोग के लिए आवश्यकता होगी प्रदान नहीं करता है।

यह एक सादे पुराने की तुलना में कम आम है float, जिसका कुछ मामूली पठनीयता प्रभाव है (अन्य लोगों को तुरंत पता नहीं चल सकता है कि यह एक नज़र में क्या है)। यह भी अंतर्निहित रूप से परिवर्तित नहीं होता हैfloat इसलिए आप something.FloatValueबहुत कुछ लिख रहे हैं , जो कि एक बड़ी बात नहीं है, लेकिन थकाऊ हो सकता है।

अंत में, यूनियनों और बिटफिल्ड्स का इसका उपयोग गैर-पोर्टेबल और कार्यान्वयन-परिभाषित (नीचे देखें) है। यह नहीं है आपकी समस्या है, यह सुनिश्चित करने के लिए एपिक का काम है कि प्रकार को संरचित किया जाए ताकि यह सभी समर्थित कार्यान्वयनों के लिए उपयोग करने योग्य हो, लेकिन यह बग का एक संभावित स्रोत है यदि वे नए कंपाइलर के प्रकार के कार्यान्वयन के साथ किसी मुद्दे को पकड़ने में विफल रहते हैं। संस्करण जारी किया गया है या समर्थित संकलक की सूची में जोड़ा गया है।

इसलिए जब तक आपको फ्लोटिंग पॉइंट प्रतिनिधित्व में व्यक्तिगत बिट्स के साथ खेलने की आवश्यकता नहीं है, आपको शायद बस से बचना चाहिए FFloat32 (इसके चचेरे भाई, से FFloat16थोड़ा अधिक उपयोगिता हो सकती है क्योंकि कोई मानक 16-बिट सी ++ फ्लोटिंग पॉइंट प्रकार नहीं है)।

यह " गति " के लिए अपने घटकों के पूर्णांक अभ्यावेदन के माध्यम से फ़्लोट्स में हेरफेर करने के लिए सामान्य होता था । आधुनिक कंप्यूटर बहुत से प्लेटफ़ॉर्मों और विभिन्न प्रकारों के लिए आवश्यक हैं इस प्रकार की चीज़ों को करने के लिए इस्तेमाल की जा सकने तकनीकें वास्तव में किसी भी घटना में प्रदर्शन या शुद्धता के लिए हानिकारक हो सकती हैं।

यह बताना चाहिए कि अवास्तविक की गिटहब रिपॉजिटरी की खोज से इस FFloat32प्रकार के बहुत कम उपयोगों का पता चलता है । वे सभी FFloat32स्वयं की परिभाषा में या की परिभाषा में हैं FFloat16


विशेष रूप से, FFloat32दो चीजें करता है जिन्हें C ++ मानक कहता है। यह:

  • आपको ऐसा कार्य करने की अनुमति देता है जैसे कि एक समय में संघ के एक से अधिक सदस्य सक्रिय हों; आपसे फ़्लोटिंग पॉइंट सदस्यों को लिखने और पूर्णांक सदस्यों में से एक से पढ़ने की उम्मीद है (9.5.1, [class.union))
  • एक IEEE फ़्लोटिंग पॉइंट मान के बिट आवंटन के मिलान के लिए यूनियन के भीतर बिटफील्ड आवंटन की अपेक्षा करता है; हालाँकि, एक वर्ग प्रकार के भीतर बिटफील्ड के सदस्यों का आवंटन और संरेखण कार्यान्वयन परिभाषित है (9.6.1, [class.bit])

अवास्तविक को मानक C ++ में नहीं लिखा जाता है, यह उस विशेष संकलक के लिए लिखा जाता है जिसके लिए लिखा जाता है, इसलिए जब तक वे अपेक्षित कार्य करते हैं तब तक मानक अप्रासंगिक होता है।
user253751

मुझे उम्मीद है कि मानक बिट / सी ++ में भी वे बिटफ़िल्ड काफी पोर्टेबल होंगे, क्योंकि वे एक आईईईई मानक द्वारा परिभाषित किए गए हैं, और किसी भी कंपाइलर के लिए एक अलग लेआउट का उपयोग करने से आईईईई 754 अनुरूप लाल निशान नहींfloat मिलेगा (और मौजूदा सॉफ़्टवेयर के साथ संगतता की परेशानी। )।
दिमित्री ग्रिगोरीव

3
(पांडित्यपूर्ण) मुद्दा यह है कि उन बिट क्षेत्रों का लिखित आदेश IEEE मानक से मेल खा सकता है, लेकिन C ++ कंपाइलर उन्हें फिर से व्यवस्थित या फिर से संरेखित कर सकता है। यह केवल एक मामूली फुटनोट है, हालांकि इससे निपटने के लिए एपिक का काम है; प्रकार को सही ढंग से सत्यापित करने के लिए उन्हें प्रत्येक नए संकलक संस्करण की निगरानी करनी चाहिए।

@JoshPetrie प्वाइंट लिया, स्पष्टीकरण के लिए धन्यवाद।
दिमित्री ग्रिगोरीव

1
@JustinLardfox लेकिन FFloat32 में floatयूनियन में एक सदस्य शामिल है , इसलिए यदि floatवास्तव में 32 बिट्स से बड़ा है तो समग्र FFloat32रूप से अच्छी तरह से होगा क्योंकि यूनियन को सबसे बड़ा सदस्य रखने के लिए काफी बड़ा होना चाहिए। ऐसे मामलों में जहां फ़्लोट्स चार बाइट्स से बड़े होते हैं, महाकाव्य को संघ के बिटफ़ील्ड भागों को संशोधित करने के साथ-साथ उन्हें संबोधित करना होगा, अन्यथा वे पूर्ण फ़्लोट को मैप नहीं करेंगे।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.