2012-11-24 15 views
5

से अधिक रखती है निम्नलिखित जावा कोड पर विचार करें से एक डबल पार्स:एक स्ट्रिंग जो एक मूल्य Double.MaxValue

String toParse = "1.7976931348623157E308"; //max value of a double in java   
double parsed = Double.parseDouble(toParse); 
System.out.println(parsed); 

1.7976931348623157E308 सब कुछ का उल्लेख मूल्य के लिए समझ में आता है और एक ही सही उत्पादन हो जाता है।

अब, यदि कोई 1.7976931348623158E308 को पार्स करने का प्रयास करता है (E से पहले अंतिम अंक बढ़ता है) तो आपको अभी भी कंसोल में मुद्रित अधिकतम मूल्य मिलता है!
1.7976931348623159E308 को पार्स करने का प्रयास करने के बाद (फिर से अंतिम अंक बढ़ गया) और अधिक से अधिक Infinity प्राप्त हो जाता है।
संबंधित नकारात्मक मानों के लिए समान व्यवहार।

... 8E308... 7E308 पर Infinity क्यों नहीं है?

+1

क्या यह किसी भी आवेदन के लिए कोई प्रासंगिकता है? – AlexWien

+1

मुझे लगता है कि आप किनारे के मामलों के साथ मजाक कर रहे हैं। क्या आपने सोर्स कोड देखा है? –

+0

@AlexWien बस "दुर्घटना" द्वारा इस पर ठोकर खाई, अब मैं उत्सुक हूं –

उत्तर

9

parseDouble दस्तावेज के एसई 7 संस्करण valueOf प्रलेखन जो कहते हैं को संदर्भित करता है:

ध्यान दें कि दौर करने वाली निकटतम नियम भी अतिप्रवाह और underflow व्यवहार का तात्पर्य; यदि एस का सटीक मान परिमाण में काफी बड़ा है (MAX_VALUE + ulp (MAX_VALUE)/2 के बराबर या उसके बराबर), डबल करने के लिए गोल करने से परिणाम अनंत हो जाएंगे और यदि सटीक मान परिमाण में पर्याप्त छोटा है (कम या/2 MIN_VALUE के लिए), फ्लोट करने के लिए एक शून्य में परिणाम होगा गोलाई बराबर। से

यह है कि राउंडिंग डबल टाइप करने के लिए है आईईईई 754 के सामान्य दौर करने वाली निकटतम शासन चल द्वारा बयान के अनुरूप है -पॉइंट अंकगणितीय

आपको एक्सपोनेंट सीमा को अनदेखा करने के बाद निकटतम फ़्लोटिंग पॉइंट नंबर की गणना करके और फिर जांच करनी चाहिए कि एक्सपोनेंट फिट बैठता है या नहीं। Double.MAX_VALUE कुछ नियमों के लिए उस नियम के तहत निकटतम संख्या है उस इससे सख्ती से अधिक हैं।

यह सामान्य राउंडिंग व्यवहार है इस बात की पुष्टि करने के लिए, पर विचार निम्नलिखित कार्यक्रम:

public class Test { 
     public static void main(String[] args) { 
     double ulp = Math.ulp(Double.MAX_VALUE); 
     System.out.println(ulp); 
     System.out.println(Double.MAX_VALUE); 
     System.out.println(Double.MAX_VALUE+ulp/2.0000000001); 
     System.out.println(Double.MAX_VALUE+ulp/2); 
     } 
    } 

यह आउटपुट:

1.9958403095347198E292 
1.7976931348623157E308 
1.7976931348623157E308 
Infinity 

भी थोड़ा कम से कम Double.MAX_VALUE को आधे से एक ULP परिवर्तन नहीं करता है कुछ जोड़ना यह। अनंतता के लिए आधे अल्पा ओवरफ्लो जोड़ना।

+0

उदाहरण कोड के लिए +1, यह वह हिस्सा था जो मेरे सिर को इसके चारों ओर लपेटता था! धन्यवाद, पेट्रीसिया –

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