मुझे उन सभी चेतावनियों को अक्षम करने के लिए 3.14 के बजाय 3.14f लगाने की आवश्यकता क्यों है? क्या इसके लिए कोई सुसंगत कारण है?क्यों 3.14 जैसे फ्लोटिंग पॉइंट वैल्यू को एमएसवीसी में डिफॉल्ट रूप से डबल माना जाता है?
उत्तर
क्या सी ++ (और सी) मानक का फैसला किया है यही कारण है कि। फ़्लोटिंग पॉइंट अक्षर दो प्रकार के होते हैं, और यदि आपको उन्हें फ़्लोट करने की आवश्यकता होती है, तो आप उन्हें f
से प्रत्ययित करते हैं। ऐसा कोई विशेष कारण नहीं है कि क्यों, लेकिन मुझे लगता है कि यह ए है) सी के साथ संगतता के लिए, और बी) परिशुद्धता और भंडारण के बीच एक व्यापार-बंद।
2.13.3 फ्लोटिंग शाब्दिक एक fl oating शाब्दिक के प्रकार डबल जब तक स्पष्ट रूप से एक प्रत्यय द्वारा निर्दिष्ट है। प्रत्यय एफ और एफ फ्लोट निर्दिष्ट करते हैं, प्रत्यय एल और एल लंबे डबल निर्दिष्ट करते हैं। , कार्यक्रम बीमार का गठन किया जाता है तो बढ़ाया मूल्य अपने प्रकार के लिए प्रदर्शनीय मूल्यों की श्रेणी में नहीं है।
यह शायद सी दुनिया में एक मानक है। डबल को प्राथमिकता दी जाती है क्योंकि यह अधिक सटीक है और आपको शायद कोई प्रदर्शन अंतर दिखाई नहीं देगा। this post पढ़ें।
आज की मशीन पर लगभग हां, लेकिन एक एम्बेडेड डिवाइस पर जो एफपीयू है, मैं इतना निश्चित नहीं हूं ... – jokoon
@ गोकून: यह सच है; डिफ़ॉल्ट रूप से मुझे लगता है कि हम "सामान्य" मशीनों के बारे में बात कर रहे हैं। इसके द्वारा मेरा मतलब डेस्कटॉप पीसी और सर्वर है।एक एम्बेडेड डिवाइस पर, ऑप्टिमाइज़ेशन महत्वपूर्ण है और कुछ मामलों में शॉर्ट और इंट के बीच एक विकल्प बनाना असामान्य नहीं है। – darioo
यहां तक कि एक एफपीयू के साथ, एक डबल को फ्लोट की जगह दोगुनी जगह की आवश्यकता होती है, इसलिए जब डेटा की बहुत बड़ी मात्रा * प्रोसेसिंग होती है, तो मेमोरी बैंडविड्थ तब भी महत्वपूर्ण हो सकती है जब व्यक्तिगत रजिस्टर स्तर के संचालन समान समय लेते हैं। – Clifford
C और C++ तरीके के एक जोड़े में फ्लोट करने के लिए डबल पसंद करते हैं। जैसा कि आपने देखा है, स्पष्ट रूप से फ़्लोट किए जाने तक आंशिक अक्षर दोहरे होते हैं। इसके अलावा, फ्लोट्स varargs में पारित नहीं किया जा सकता है, वे हमेशा डबल करने के लिए प्रोत्साहित किया जाता है (उसी तरह चार और छोटे varargs में int को बढ़ावा दिया जाता है)।
यह शायद एक अनुबंधित double
, बजाय double
जा रहा है एक विस्तारित float
होने के रूप में float
के बारे में सोच करने के लिए बेहतर है। यही है, double
पसंदीदा फ़्लोटिंग पॉइंट प्रकार है, और float
का उपयोग तब भी किया जाता है जब किसी विशेष मामले के लिए double
का एक छोटा संस्करण आवश्यक होता है। यह निकटतम कारण है जो मुझे एक सुसंगत कारण के बारे में पता है, और फिर नियम समझ में आता है, भले ही आप उस मामले में हों जहां आपको एक छोटे संस्करण की आवश्यकता हो।
यह MSVC के लिए अजीब नहीं है, यह भाषा मानक के लिए आवश्यक है।
मैं सुझाव दूंगा कि यह स्पष्ट रूप से अनुरोध किए जाने तक परिशुद्धता को कम करने के लिए नहीं समझता है, इसलिए डिफ़ॉल्ट डबल है।
परिशुद्धता के 6 महत्वपूर्ण अंक जो कि एक सिंगल-प्रेसिजन फ्लोट प्रदान करता है, सामान्य उपयोग के लिए शायद ही कभी पर्याप्त होता है और निश्चित रूप से एक आधुनिक डेस्कटॉप प्रोसेसर पर हाथ कोडित अनुकूलन के रूप में उपयोग किया जाएगा जहां लेखक ने यह निर्धारित किया है कि यह पर्याप्त और आवश्यक है; इसलिए यह समझ में आता है कि सिंगल-प्रेसिजन शाब्दिक निर्दिष्ट करने के लिए एक स्पष्ट दृश्यमान मार्कर आवश्यक है।
+1; @ गोकून: यदि आप उचित प्रकार या आकार प्राप्त करना चाहते हैं तो आपको अन्य प्रत्यय भी उपयोग करना चाहिए। उदाहरण के लिए, यदि आप एक हस्ताक्षरित 64 बिट मान चाहते हैं, तो आप प्रत्यय 'ull' – franji1
क्योंकि double
3.14 अनुमान लगा सकता है ज्यादा float
की तुलना में बेहतर है, शायद?
3,140000000000000124344978758017532527446746826171875 (double
)
3,1400001049041748046875 (float
)
का उपयोग करें, जिनमें से कोई भी पीआई के लिए अच्छा अनुमान नहीं है: -D – franji1
है कि यह नहीं और वह काफी निश्चित ओपी के सवाल का जवाब,: यहाँ सटीक मान रहे हैं? –