नकारात्मक क्यों नहीं में Double.MIN_VALUE है


157

क्या कोई इस पर कुछ प्रकाश डाल सकता Double.MIN_VALUEहै कि वास्तव में डबल्स का न्यूनतम मूल्य क्यों नहीं है? यह एक सकारात्मक मूल्य है, और निश्चित रूप से एक डबल नकारात्मक हो सकता है।

मैं समझता हूं कि यह एक उपयोगी संख्या क्यों है, लेकिन यह एक बहुत ही अनपेक्षित नाम लगता है, खासकर जब इसकी तुलना में Integer.MIN_VALUE। इसे Double.SMALLEST_POSITIVEया इससे MIN_INCREMENTमिलते जुलते शब्दों में स्पष्ट शब्दार्थ होगा।

इसके अलावा, डबल्स क्या न्यूनतम मूल्य है? क्या यह है -Double.MAX_VALUE? डॉक्स कहना नहीं लगता।


1
प्रतिक्रियाओं के लिए धन्यवाद! सीमा और परिशुद्धता के बीच का अंतर समझ में आता है। मुझे अभी भी नामकरण काफी अजीब और असंगत लगता है, लेकिन यह व्यावहारिक है।
मो-सेफ

1
मैं अनुमान लगा रहा हूं क्योंकि यह उन्हीं प्रतिभाओं द्वारा लिखा गया है, जो एक विधि को कहते हैं, writeBytesजो एक लेती है String
ट्रेकजाज़

मूल रूप से, आप सही कह रहे हैं, यह खराब शब्दार्थ है
अल्वारो

जवाबों:


180

IEEE 754 प्रारूप में हस्ताक्षर के लिए एक बिट आरक्षित है और शेष बिट्स परिमाण का प्रतिनिधित्व करते हैं। इसका मतलब यह है कि यह ओरिगेनो के आसपास "सममित" है (जैसा कि एंगर मूल्यों के विपरीत है, जिसका एक और नकारात्मक मूल्य है)। इस प्रकार, न्यूनतम मान केवल अधिकतम मूल्य के समान है, साइन-बिट के साथ बदल गया है, इसलिए हां , -Double.MAX_VALUEसबसे छोटा संभव वास्तविक संख्या है जिसे आप एक के साथ प्रतिनिधित्व कर सकते हैं double

मुझे लगता है कि Double.MAX_VALUEइसे अधिकतम परिमाण के रूप में देखा जाना चाहिए , जिस स्थिति में यह वास्तव में बस लिखने के लिए समझ में आता है -Double.MAX_VALUE। यह भी बताता Double.MIN_VALUEहै कि कम से कम सकारात्मक मूल्य क्यों है (क्योंकि यह कम से कम संभव परिमाण का प्रतिनिधित्व करता है)।

लेकिन यकीन है, मैं मानता हूं कि नामकरण थोड़ा भ्रामक है। अर्थ के लिए इस्तेमाल किया जा Integer.MIN_VALUEरहा है , मैं भी थोड़ा आश्चर्यचकित था जब मैंने पढ़ा कि Double.MIN_VALUEसबसे छोटा निरपेक्ष मूल्य था जिसका प्रतिनिधित्व किया जा सकता था। शायद उन्होंने सोचा था कि यह कम से कम संभव मूल्य का प्रतिनिधित्व करने के लिए एक निरंतर है क्योंकि यह बस -से दूर है MAX_VALUE:-)

(ध्यान दें, वहाँ भी है, Double.NEGATIVE_INFINITYलेकिन मैं इससे अवहेलना कर रहा हूँ, क्योंकि इसे "विशेष मामले" के रूप में देखा जाना है और वास्तव में यह किसी वास्तविक संख्या का प्रतिनिधित्व नहीं करता है।)

यहाँ इस विषय पर एक अच्छा पाठ है।


3
इसके लिए धन्यवाद। मैं कुछ सांख्यिकीय विश्लेषण कोड को पोर्ट कर रहा था और आँख बंद करके जावा को C # में अनुवाद कर रहा था। मैंने -infinity या NaN पर आने वाली कुछ संख्याओं पर ध्यान दिया और एल्गोरिथ्म पर करीब से नज़र डाली। मुझे एहसास हुआ कि double.MIN_VALUE ने संदर्भ में कोई मतलब नहीं बनाया और एक खोज की। यह पोस्ट जावा डॉक्स से पहले आता है। यह वास्तव में एक भ्रमित नाम है जो वास्तव में डबल है। एप्सिलॉन। कोई बड़ी बात नहीं, ठीक करने में एक मिनट से भी कम समय लगा, लेकिन निश्चित रूप से आश्चर्य की बात है।
एड।

"एप्सिलॉन 'का नाम माना जाने वाला" सबसे छोटा निरपेक्ष मूल्य नहीं है "?
डेव कजिनो

@Sahagin, यह वास्तव में "माना" नहीं है कि किसी भी चीज़ का नाम दिया जाए। एप्सिलॉन सिर्फ एक ग्रीक अक्षर है जो आमतौर पर गणित / भौतिकी में मनमाने ढंग से छोटी सकारात्मक मात्रा का प्रतिनिधित्व करता है। SmallestNonzeroFloat64उदाहरण के लिए चुना ।
aioobe

12

इन स्थिरांक का संकेत से कोई लेना-देना नहीं है। यह अधिक समझ में आता है अगर आप एक डबल को तीन भागों के समग्र के रूप में मानते हैं: साइन, एक्सपोनेंट और मंटिसा। Double.MIN_VALUE वास्तव में मंटिसा सबसे छोटा मान हो सकता है जब एक्सप्रेशन न्यूनतम मूल्य पर होता है इससे पहले कि फ्लश शून्य हो। इसी तरह MAX_VALUE को सबसे बड़ा मान समझा जा सकता है, जब अनंत के फ्लश होने से पहले घातांक अधिकतम मान पर होता है।

इन दोनों के लिए एक अधिक वर्णनात्मक नाम सबसे बड़ा निरपेक्ष हो सकता है (क्रिया के लिए गैर-शून्य जोड़ें) और सबसे छोटा निरपेक्ष मान (क्रिया के लिए गैर-अनन्तता जोड़ें)।

की जाँच करें आईईईई 754 (1985) जानकारी के लिए मानक। एक संशोधित (2008) संस्करण है, लेकिन यह केवल अधिक स्वरूपों का परिचय देता है जो जावा द्वारा समर्थित नहीं हैं (कड़ाई से बोलते हुए जावा को IEEE 754 1985 की कुछ अनिवार्य विशेषताओं के लिए समर्थन की कमी है, जैसे कई अन्य उच्च स्तरीय भाषाएं)।


4

मुझे लगता है कि भ्रमित करने वाले नामों को C में वापस खोजा जा सकता है , जो परिभाषित किया गया हैFLT_MIN सबसे छोटी सकारात्मक संख्या के रूप में किया गया है।

जावा की तरह, जहां आपको उपयोग करना है -Double.MAX_VALUE, आपको -FLT_MAXसी में सबसे छोटी फ्लोट प्राप्त करने के लिए उपयोग करना होगा।


3

एक डबल के लिए न्यूनतम मूल्य Double.NEGATIVE_INFINITYयही कारण Double.MIN_VALUEहै कि वास्तव में एक के लिए न्यूनतम नहीं है Double

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

यदि आप वास्तव में एक डबल के लिए न्यूनतम मूल्य चाहते हैं जो अनंत नहीं है तो आप उपयोग कर सकते हैं -Double.MAX_VALUE


1
उस विचार के बाद, एक Double Double.MAX_VALUE या Double.POSITIVE_INFINITY के लिए अधिकतम मान है?
मो-सेफ़

Double.MIN_VALUEके बराबर हो सकता है Double.NEGATIVE_INFINITY
starblue

@starblue, नहीं। @ मो-सीफ, Double.POSITIVE_INFINITY+ ∞> सब कुछ और — - <सब कुछ
कॉलिन हेबर्ट

@ कोलिन हेबर्ट,> = और <= सटीक होने के लिए ;-)
aioobe

आपने शायद मुझे गलत समझा। एक बेहतर दुनिया में, Double.MIN_VALUEइसके बराबर होगा Double.NEGATIVE_INFINITY, क्योंकि तब यह MIN_VALUEपूर्णांक प्रकारों के अनुरूप होगा । मैं अधिकतम के साथ कंप्यूटिंग के लिए किसी भी चर को इनिशियलाइज़ कर सकता हूं MIN_VALUEऔर यह सही होगा। Double.MIN_VALUEअब हमारे पास एक बेहतर नाम होगा। (और तुलनात्मक रूप से के लिए MAX_VALUE।)
starblue

2

फ्लोटिंग पॉइंट नंबरों के साथ, सटीक वही है जो महत्वपूर्ण है क्योंकि कोई सटीक सीमा नहीं है

/**
 * A constant holding the smallest positive nonzero value of type
 * <code>double</code>, 2<sup>-1074</sup>. It is equal to the
 * hexadecimal floating-point literal
 * <code>0x0.0000000000001P-1022</code> and also equal to
 * <code>Double.longBitsToDouble(0x1L)</code>.
 */

लेकिन मैं मानता हूं कि इसे शायद कुछ बेहतर नाम दिया जाना चाहिए :)


ठीक है, लेकिन फिर Double.MAX_VALUE होने का कोई मतलब क्यों है? यह स्पष्ट रूप से परिभाषित किया गया है।
मो-सेफ

क्योंकि इसका अधिकतम सटीक मूल्य (गैर अनंत) है, इसके संकेत के लिए लेखांकन नहीं है।
जॉन गार्डनर

0

जैसा कि दस्तावेजों में कहा गया है ,

Double.MIN_VALUE , डबल, 2 ^ (- 874) का सबसे छोटा पॉज़िटिव नॉनज़ेरो मान रखने वाला एक स्थिर है ।

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

अपूर्णांश, हमेशा एक सकारात्मक संख्या , फ्लोटिंग प्वाइंट नंबर की महत्वपूर्ण अंक रखती है। प्रतिपादक मूलांक की सकारात्मक या नकारात्मक शक्ति को इंगित करता है कि मंटिसा और संकेत को गुणा करना चाहिए। फ्लोटिंग-पॉइंट वैल्यू प्राप्त करने के लिए चार घटकों को निम्नानुसार संयोजित किया गया है

यहां छवि विवरण दर्ज करें

सोचें कि MIN_VALUE न्यूनतम मूल्य है जिसे मंटिसा प्रतिनिधित्व कर सकती है। फ्लोटिंग पॉइंट प्रतिनिधित्व के न्यूनतम मान के रूप में न्यूनतम परिमाण है जिसका उपयोग करके प्रतिनिधित्व किया जा सकता है। (हालांकि इस भ्रम से बचने के लिए एक बेहतर नाम का इस्तेमाल किया जा सकता है)

123> 10> 1> 0.12> 0.012> 0.0000123> 0.000000001> 0.0000000000000001


नीचे सिर्फ FYI करें।

डबल-परिशुद्धता फ़्लोटिंग पॉइंट 2 ^ -1074 से 2 ^ 1023 के माध्यम से दो की 2,098 शक्तियों का प्रतिनिधित्व कर सकता है। दो की असामान्य शक्तियां 2 ^ -1074 से 2 ^ -1023 के माध्यम से हैं; दो की सामान्यीकृत शक्तियां 2 ^ -1022 से 2 ^ 1023 से होती हैं। यह और यह देखें ।


धन्यवाद! मुझे नहीं पता कि यह जवाब क्यों दिया गया।
कंबाइन करें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.