2012-04-10 5 views
8

मैंDouble.POSITIVE_INFINITY == Float.POSITIVE_INFINITY

System.out.println(Double.isInfinite(Float.POSITIVE_INFINITY)) 
System.out.println(Double.isInfinite(Float.NEGATIVE_INFINITY)); 

की कोशिश की और उत्पादन

true 
true 

तो इस का अर्थ है "इन्फिनिटी" दोनों डेटा प्रकार के लिए एक ही है था?

उत्तर

8

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

नहीं, हालांकि, थोड़ा स्तर पर दो infinities अलग हैं। जावा में एक डबल 64 बिट्स है, और एक फ्लोट जावा में 32 बिट्स है, इसलिए मामूली रूप से वे प्रतिनिधित्व स्तर पर अलग हैं।

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

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

+0

मैं देखना float upcasting के बाद double साथ double की तुलना करें। और 'Double.compare (डबल, डबल)' विधि स्मार्ट (या शायद गूंगा?) 'Double.compare (Float.POSITIVE_INFINITY, Double.POSITIVE_INFINITY)' के लिए 0 लौटने के लिए पर्याप्त होगी? – user113454

+1

@ user1064918 इसका 'डबल' से कोई लेना देना नहीं है।तुलना करें (डबल, डबल) '। जैसा कि मैंने अपने जवाब में कहा है, जहां भी एक डबल की उम्मीद है और एक फ्लोट की आपूर्ति की जाती है, फ्लोट स्वचालित रूप से एक डबल पर डाला जाता है, इसलिए 'डबल डॉट कॉम (डबल, डबल)' केवल दो युगल देखता है। * जेवीएम और हार्डवेयर * 32-बिट अनंतता (फ्लोट) को पहचानने के लिए पर्याप्त स्मार्ट हैं और इसे 64-बिट अनंतता (डबल) में परिवर्तित करते हैं। –

+0

यह समझ में आता है। धन्यवाद – user113454

1

यह "समान" से आपका क्या मतलब है इस पर निर्भर करता है। बिट पैटर्न अलग हैं क्योंकि साइन अलग है, लेकिन वे अभी भी दोनों अनंत हैं।

इसके अतिरिक्त, फ्लोट के लिए पदोन्नति नियम डबल पर परिवर्तित होने पर अनंत प्रकृति को संरक्षित रखेंगे।

+0

हो सकता है 'वही' से मेरा मतलब है कि यदि आप दोनों का अंतर लेते हैं, तो आपको शून्य मिलेगा। मैंने जांच नहीं की है कि दोनों मामलों के लिए थोड़ा पैटर्न क्या होगा। लेकिन क्या वे समान नहीं होना चाहिए, क्योंकि Double.compare (...) विधि इस पर निर्भर करती है? – user113454

+3

@ user1064918 नहीं, बिट पैटर्न समान नहीं हैं, क्योंकि फ्लोट 32 बिट्स और युगल 64 बिट्स हैं। इसके अलावा, यदि आप दोनों का अंतर लेते हैं, तो आपको NaN मिल जाएगा, क्योंकि इन्फिनिटी - इन्फिनिटी गणित में एक संख्या नहीं है। –

+1

@ user1064918: वास्तव में, 'Float.POSITIVE_INFINITY - Float.POSITIVE_INFINITY'' FloN.POSITIVE_INFINITY + Float.NEGATIVE_INFINITY' जैसा 'NaN' भी है। दो infinities के घटाव को परिभाषित नहीं किया गया है, भले ही आप किस डेटा प्रकार का उपयोग करते हैं। – Amadan

1

जावा में, आप सीधे double की तुलना float से नहीं कर सकते। इसके बजाय, जब आप ऐसा करने का प्रयास करते हैं, तो float स्वचालित रूप से double पर स्वचालित रूप से परिवर्तित हो जाता है। एक ही thinng तब होता है जब आप float को उस विधि में पास करते हैं जो double तर्क लेता है। और जब आप Float.POSITIVE_INFINITY (उदाहरण के लिए) को double में कनवर्ट करते हैं तो आपको Double.POSITIVE_INFINITY मिलता है।

तो अपने प्रश्न का उत्तर है कि Double.POSITIVE_INFINITY और Float.POSITIVE_INFINITY पूरी तरह से एक ही बात नहीं कर रहे हैं, लेकिन वे दोनों को निरूपित "एक नंबर है कि प्रतिनिधित्व करने के लिए बहुत बड़ा है" और इसलिए जवाब == देता है कि आप तार्किक रूप से संगत है।

1

जावा में double के साथ की तुलना करने का कोई तरीका नहीं है। सभी आपरेशनों आप का उपयोग करने की संभावना है implcitly एक double

float f= 
double d = 
Double.compare(f, d); 
// equivelent to 
Double.compare((double) f, d);