2012-12-31 93 views
30

आपको एक फ्लोट शाब्दिक में प्रत्यय f निर्दिष्ट करने की आवश्यकता क्यों है?जावा: आपको एक फ्लोट शाब्दिक में 'एफ' निर्दिष्ट करने की आवश्यकता क्यों है?

+3

अन्यथा, यह _float_ literal नहीं होगा। – SLaks

+1

हालांकि यह सी के लिए है, आप फ्लोटिंग-पॉइंट निरंतर सूक्ष्मता पर इस प्रश्नोत्तरी को पसंद कर सकते हैं। मेरा मानना ​​है कि पांच में से प्रत्येक प्रश्न जावा में बिल्कुल वही काम करेगा। http://blog.frama-c.com/index.php?post/2011/11/08/Floating-point-quiz –

+0

संभावित डुप्लिकेट [फ्लोट मानों के बाद क्यों एफ रखा गया है?] (http: // stackoverflow। कॉम/प्रश्न/9748160/क्यों-एफ-है-रखा-बाद-फ्लोट-वैल्यू) –

उत्तर

39

क्योंकि अन्यथा यह double पर डिफ़ॉल्ट है, जो float से अधिक सामान्य रूप से उपयोग किया जाने वाला फ़्लोटिंग पॉइंट प्रकार है।

Java Language Specification, section 3.10.2 से:

एक फ्लोटिंग प्वाइंट शाब्दिक अगर यह एक ASCII पत्र एफ या च के साथ प्रत्यय है प्रकार नाव की है, अन्यथा इसका प्रकार दोगुना है और यह वैकल्पिक रूप से ASCII अक्षर डी या डी (§4.2.3) के साथ प्रत्ययित किया जा सकता है।

(व्यक्तिगत तौर पर मैं कोई डिफ़ॉल्ट था बल्कि वहाँ थे, यह सभी मामलों में स्पष्ट करना है, लेकिन यह एक अलग बात है।)

+1

लेकिन फिर एक प्रकार का मंदी क्यों होता है यदि यह किसी भिन्न प्रकार से चूक जाता है? मैं समझता हूं कि डबल सिर्फ 64 बिट फ्लोट है लेकिन क्या ऐसा करने के लिए कुछ गहरा तर्क है? – stackoverflow

+1

@ स्टैक ओवरफ्लो: आपका क्या मतलब है? * शाब्दिक * का प्रकार आपके द्वारा उपयोग किए जाने वाले चर के प्रकार से कुछ हद तक स्वतंत्र है। उदाहरण के लिए, आप 'फ्लोट' शाब्दिक का उपयोग कर सकते हैं और इसे 'डबल' चर' में असाइन कर सकते हैं। ज्यादातर मामलों में, अभिव्यक्ति का प्रकार उस संदर्भ से स्वतंत्र होता है जिसमें इसका उपयोग किया जाता है। (ऐसी स्थितियां हैं जहां जेनेरिक के लिए प्रकार अनुमानित हैं, लेकिन यह एक विशेष मामला है।) –

+1

@ स्टैक ओवरफ्लो जावा समर्थन [संकीर्ण रूपांतरण] का समर्थन करता है (http://docs.oracle.com/javase/specs/jls/se7/html/jls- 5.html # jls-5.2) primitives को अक्षर के असाइनमेंट के दौरान। यही कारण है कि आप 'फ्लोट एफ = 1.0 हो सकते हैं; 'हालांकि' 1.0' एक डबल है।मुझे लगता है कि यह समर्थित है क्योंकि यह स्पष्ट है - उदाहरण के लिए, एक विधि कॉल के साथ एक शाब्दिक उपयोग करने के विपरीत। – McDowell

28

क्योंकि unsuffixed फ्लोटिंग प्वाइंट शाब्दिक युगल रहे हैं, और राउंडिंग है कि इसका मतलब है फ्लोट और डबल के लिए गोल होने पर छोटे अक्षर अलग-अलग मूल्यों पर ले सकते हैं। यह निम्न उदाहरण में मनाया जा सकता है:

float f = (float) 0.67; 
if(f == 0.67) 
    System.out.print("yes"); 
else 
    System.out.print("no"); 

हो जाएगा ताकि उत्पादन no, जब जब दोगुना करने के लिए गोल से यह करता है फ्लोट करने के लिए गोल क्योंकि 0.67 एक अलग महत्व है। दूसरी ओर:

float f = (float) 0.67; 
if(f == 0.67f) 
    System.out.print("yes"); 
else 
    System.out.print("no"); 

और नरकिप; आउटपुट yes

संपादित
दूसरा उदाहरण:

if(0.67 == 0.67f) 
    System.out.print("Equal"); 
else 
    System.out.print("Not Equal"); 
4

दो चल बिन्दु प्रकार है कि जैसे के रूप में प्रतिनिधित्व किया जा सकता है कर रहे हैं 100.0। केवल एक डिफ़ॉल्ट हो सकता है। इसकी सीमित परिशुद्धता के कारण, फ्लोट एक बेहद विशिष्ट प्रकार है। सामान्य मामला दोगुना है, इसलिए यह उचित डिफ़ॉल्ट है।

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

+0

आपकी प्रतिक्रिया के लिए धन्यवाद – stackoverflow