2017-04-26 7 views
5

पूर्णांक, नाव और स्काला में लंबे की अधिकतम मान हैं:दोस्तों के बीच Int.MaxValue क्या है?

Int.MaxValue = 2147483647

Float.MaxValue = 3.4028235E38

Long.MaxValue = 9223372036854775807L

स्कैला कंपाइलर के लेखकों से, Keynote, PNW Scala 2013, स्लाइड 16 What's Int.MaxValue between friends?:

val x1: Float = Long.MaxValue 
val x2: Float = Long.MaxValue - Int.MaxValue 
println (x1 == x2) 

// NO WONDER NOTHING WORKS 

यह अभिव्यक्ति true क्यों लौटती है?

+0

कि संकलन करता है? आपको 'x2' के बाद बराबर की आवश्यकता नहीं है? – Carcigenicate

+0

मैं इसे पुन: पेश नहीं कर सकता। मुझे इसके बजाय एक वाक्यविन्यास त्रुटि मिलती है। –

+1

मैंने आपके द्वारा उल्लिखित स्लाइड पाई। आपके द्वारा पोस्ट किया गया कोड स्लाइड पर कोड से अलग है। स्लाइड पर कोड में वाक्यविन्यास त्रुटि नहीं है। –

उत्तर

10

Float एक 4-बाइट फ़्लोटिंग पॉइंट मान है। इस बीच एक Long एक 8-बाइट मान है और Int भी 4-बाइट मान है। हालांकि, 4-बाइट फ्लोटिंग पॉइंट मानों में जिस तरह से संख्याएं संग्रहीत की जाती हैं, इसका मतलब है कि उनके पास परिशुद्धता के लगभग 8 अंक हैं। नतीजतन, उनके पास कम से कम 4 महत्वपूर्ण बाइट्स (दूसरे 9-10 अंक) के मूल्य के बावजूद लंबे समय तक 4 सबसे महत्वपूर्ण बाइट्स (लगभग 9-10 अंकों) को स्टोर करने की क्षमता नहीं है।

परिणामस्वरूप, Float दो अभिव्यक्तियों का प्रतिनिधित्व समान है, क्योंकि अलग-अलग बिट्स Float के संकल्प के नीचे हैं। इसलिए दो मान बराबर तुलना करते हैं।

+3

एक उत्तर लिखने के लिए +1 देना जो हर आग्रह से बचने के लिए "फ़्लोटिंग पॉइंट अंकगणित बेकार है!" हम सभी चाहते थे। – ashawley

3

माइक एलन के जवाब को प्रतिबिंबित करते हुए, लेकिन कुछ अतिरिक्त संदर्भ प्रदान करने की उम्मीद है (इसे एक अलग उत्तर के बजाय टिप्पणी के रूप में छोड़ दिया होगा, लेकिन एसओ की प्रतिष्ठा सुविधा मुझे नहीं जाने देगी)।

इंटेगर्स की अधिकतम सीमा 0 से 2^एन (यदि यह एक हस्ताक्षरित पूर्णांक है) या -2^(एन -1) से 2^(एन -1) (हस्ताक्षरित पूर्णांक के लिए) के रूप में परिभाषित मानों की अधिकतम सीमा है एन अंतर्निहित कार्यान्वयन में बिट्स की संख्या है (इस मामले में एन = 32)। यदि आप एक हस्ताक्षरित मूल्य के साथ 2^31 से बड़े नंबर का प्रतिनिधित्व करना चाहते हैं, तो आप int का उपयोग नहीं कर सकते हैं। एक हस्ताक्षरित लंबा 2^63 तक काम करेगा। इससे भी बड़ा कुछ भी, एक हस्ताक्षरित फ्लोट लगभग 2^127 तक जा सकता है।

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

समान मूल्यों के लिए जाता है। यदि आप 0.1 को पूर्णांक में डालते हैं, तो आपको बिल्कुल 0 मिलता है। इसे आम तौर पर पूर्णांक डेटा प्रकार में विफल होने पर नहीं माना जाता है।

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

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