जावा में कितने महत्वपूर्ण अंक तैरते हैं और युगल हैं?


83

क्या एक फ्लोट में 32 बाइनरी अंक होते हैं और एक डबल में 64 बाइनरी अंक होते हैं? प्रलेखन भी समझ में मुश्किल था।

क्या सभी बिट्स महत्वपूर्ण अंकों में अनुवाद करते हैं? या दशमलव बिंदु का स्थान कुछ बिट्स लेता है?


2
क्या उन सभी बिट्स महत्वपूर्ण अंकों में अनुवाद करते हैं? या दशमलव बिंदु का स्थान कुछ बिट्स लेता है?
ईमोन मोलोनी

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

@dystroy मुझे यकीन नहीं है कि "सटीक एक समान नहीं है" से आपका क्या मतलब है। यह बहुत समान रूप से 53 और परिशुद्धता के 24 बिट्स है, जब तक कि आप denormals का उल्लेख नहीं कर रहे हैं।
पास्कल क्यूक

2
@PascalCuoq छोटी संख्या के लिए अधिक सटीक है। जैसे-जैसे घातांक बदलता है (या बिंदु तैरता है), मंटिसा समान अंकों का प्रतिनिधित्व करता रहता है। यदि संख्या बड़ी है, तो मंटिसा "महत्वपूर्ण अंकों को कम" तक नहीं पहुंचा सकती है, इस प्रकार कम सटीकता प्रदान करती है।
विटुएल

3
@Virtuel सटीकता 53 बिट्स है। यही कारण है कि हम क्या परिशुद्धता कहते हैं। आप पूर्ण सटीकता या कुछ के बारे में सोच रहे हैं ।
पास्कल क्यूक

जवाबों:


108

फ्लोट : 32 बिट्स (4 बाइट्स) जहां 23 बिट्स मंटिसा (लगभग 7 दशमलव अंक) के लिए उपयोग किए जाते हैं। 8 बिट्स का उपयोग घातांक के लिए किया जाता है, इसलिए एक फ्लोट उन 8 बिट्स का उपयोग करके दशमलव बिंदु को दाईं या बाईं ओर "स्थानांतरित" कर सकता है। ऐसा करने से मंटिसा में बहुत सारे शून्य स्टोर करने से बचा जाता है जैसा कि 0.0000003 (3 × 10 -7 ) या 3000000 (3 × 10 7 ) में होता है। साइन बिट के रूप में 1 बिट का उपयोग किया जाता है।

डबल : 64 बिट्स (8 बाइट्स) जहां मंटिसा (लगभग 16 दशमलव अंक) के लिए 52 बिट्स का उपयोग किया जाता है। प्रतिपादक के लिए 11 बिट्स का उपयोग किया जाता है और 1 बिट साइन बिट है।

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

इसके अलावा, चूंकि सब कुछ द्विआधारी (मंटिसा और एक्सपोर्टर) में है, इसलिए दशमलव संख्याओं के रूपांतरण आमतौर पर सटीक नहीं होते हैं। 0.5, 0.25, 0.75, 0.125 जैसे नंबर बिल्कुल संग्रहीत हैं, लेकिन 0.1 नहीं है। जैसा कि अन्य लोगों ने कहा है, यदि आपको सेंट को ठीक से स्टोर करने की आवश्यकता है, तो फ्लोट या डबल का उपयोग न करें, int, long, BigInteger या BigDecimal का उपयोग करें।

स्रोत:

http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_ कंप्यूटर्स

http://en.wikipedia.org/wiki/Binary64

http://en.wikipedia.org/wiki/Binary32


6 से 9 का क्या मतलब है? यह कैसे बदल सकता है? इसलिए अगर मैं कुछ कोड चलाता हूं जिसमें 8 दशमलव अंक जैसे 0.000000001 कई बार हैं, तो मुझे अलग-अलग परिणाम मिलेंगे? क्या यही मतलब है तुम्हारा?
असितत्व

2
कुछ संख्याओं को बाइनरी में दूसरों की तुलना में अधिक सटीक रूप से दर्शाया जा सकता है। आप 0.125 (1/8, आठ दो की शक्ति) और 0.1 (1/10, दस दो की शक्ति नहीं है) में अंतर देख सकते हैं। पूर्व में अधिक (दशमलव) अंक हैं, लेकिन वास्तव में इसका प्रतिनिधित्व किया जाता है। तो यह हो सकता है कि 6 दशमलव अंकों वाली एक संख्या में 8 अंकों के साथ किसी अन्य संख्या की तुलना में बड़ी गोल त्रुटियां हैं।
मारकस

9
15.9 दशमलव अंकों के लिए doubleऔर 7.2 के लिए float, जो कि कहने के लिए 15 और 7. कुछ बड़ी संख्याओं को प्रत्येक मामले में दर्शाया जा सकता है, और इसमें से कोई भी अंशों पर लागू नहीं होता है, लेकिन इसके बारे में कोई 'औसत' नहीं है, और आपका कोई भी स्रोत नहीं कहता है अन्यथा।
user207421

1
यदि आपको शब्द औसत पसंद नहीं है, तो एक संपादन का प्रस्ताव करें। यह मेरे द्वारा पहली बार में नहीं जोड़ा गया था, इसे किसी और ने संपादित किया था ... (और मुझे वास्तव में उस संपादन की आवश्यकता नहीं दिखी)।
मार्कस

4
दिलचस्प बात यह है कि वास्तव में मंटिसा / महत्व में संग्रहीत की तुलना में सटीकता का एक और अंक है। 23 और 52 बिट्स क्रमशः फ्लोट और डबल के लिए संग्रहीत किए जाते हैं, लेकिन क्योंकि संख्याएं सामान्यीकृत हैं हम एक अग्रणी 1-बिट मान सकते हैं, फिर उसे छोड़ दें। यही कारण है कि प्रभावी परिशुद्धता क्रमशः 24 और 53 बिट्स है। सटीक दशमलव पूर्वाभासों की गणना log10 (2 ^ 24) = 7.22 और log10 (2 ^ 53) = 15.95
जॉर्जी

32

एक 32-बिट फ्लोट में परिशुद्धता के लगभग 7 अंक होते हैं और 64-बिट डबल में लगभग 16 अंक सटीक होते हैं

लंबा जवाब:

फ्लोटिंग-पॉइंट नंबरों में तीन घटक होते हैं:

  1. एक संकेत बिट, यह निर्धारित करने के लिए कि क्या संख्या सकारात्मक या नकारात्मक है।
  2. संख्या का परिमाण निर्धारित करने के लिए एक घातांक ।
  3. एक अंश, जो निर्धारित करता है कि दो घातांक मानों के बीच की संख्या कितनी दूर है। इसे कभी-कभी "महत्व, मंत्र या गुणांक" कहा जाता है

अनिवार्य रूप से, यह काम करता है sign * 2^exponent * (1 + fraction)। संख्या का "आकार", यह प्रतिपादक है, हमारे लिए अप्रासंगिक है, क्योंकि यह केवल अंश भाग के मूल्य को मापता है। यह जानने के बाद कि log₁₀(n)अंकों की संख्या कितनी है, number nहम एक फ्लोटिंग पॉइंट संख्या की सटीकता निर्धारित कर सकते हैं log₁₀(largest_possible_fraction)। क्योंकि फ्लोट में प्रत्येक बिट 2 संभावनाओं nको संग्रहीत करता है , बिट्स की एक द्विआधारी संख्या एक संख्या को स्टोर कर सकती है 2ⁿ - 1(कुल 2ⁿ मूल्यों जहां एक मान शून्य है)। यह थोड़ा बालों वाला हो जाता है, क्योंकि यह पता चलता है कि फ्लोटिंग पॉइंट संख्याओं को उपयोग किए जाने वाले एक से थोड़ा कम अंश के साथ संग्रहित किया जाता है, क्योंकि शून्य का विशेष रूप से प्रतिनिधित्व किया जाता है और सभी गैर-शून्य संख्याओं में कम से कम एक गैर-शून्य बाइनरी बिट होता है।

इसे मिलाकर, फ्लोटिंग पॉइंट संख्या के लिए सटीक का अंक है log₁₀(2ⁿ), जहां nफ्लोटिंग पॉइंट नंबर के अंश के बिट्स की संख्या है। एक 32-बिट फ्लोट में परिशुद्धता के 27.22 दशमलव अंकों के लिए 24 बिट्स का अंश होता है, और 64-बिट डबल में 53 बिट्स का अंश होता है ≈15.95 दशमलव सटीक के अंकों के लिए।

फ्लोटिंग पॉइंट सटीकता पर अधिक जानकारी के लिए, आप मशीन एप्सिलॉन की अवधारणा के बारे में पढ़ना चाह सकते हैं ।


† के लिए n ≥ 1कम से कम - अन्य नंबरों के लिए अपने सूत्र और अधिक की तरह दिखाई देगा ⌊log₁₀(|n|)⌋ + 1

Is "इस नियम को मुख्य रूप से अग्रणी बिट कन्वेंशन, निहित बिट कन्वेंशन, या छिपे हुए बिट कन्वेंशन कहा जाता है।" ( विकिपीडिया )


17

से जावा विनिर्देश :

फ़्लोटिंग-पॉइंट प्रकार फ़्लोट और डबल हैं, जो वैचारिक रूप से एकल-सटीक 32-बिट और डबल-सटीक 64-बिट प्रारूप IEEE 754 के साथ जुड़े हुए हैं और IEEE मानक में बाइनरी फ़्लोटिंग-पॉइंट अंकगणित, ANSI / IEEE के लिए निर्दिष्ट किए गए हैं। मानक 754-1985 (IEEE, न्यूयॉर्क)।

जैसा कि IEEE754 बेसिक्स को समझने के बिना संख्याओं के साथ कुछ भी करना मुश्किल है, यहां एक और लिंक है

यह समझना महत्वपूर्ण है कि परिशुद्धता एक समान नहीं है और यह पूर्णांक के रूप में की गई संख्याओं का सटीक भंडारण नहीं है।

एक उदाहरण :

double a = 0.3 - 0.1;
System.out.println(a);          

प्रिंट

0.19999999999999998

यदि आपको मनमाने ढंग से परिशुद्धता की आवश्यकता है (उदाहरण के लिए वित्तीय उद्देश्यों के लिए) तो आपको बिग दशमलव की आवश्यकता हो सकती है ।


7

एक सामान्य गणित उत्तर।

यह समझते हुए कि फ्लोटिंग पॉइंट नंबर को कुछ बिट्स के रूप में कार्यान्वित किया जाता है जो एक्सप्रेशन और बाकी का प्रतिनिधित्व करते हैं, अधिकांश अंकों के लिए (बाइनरी सिस्टम में), एक में निम्न स्थिति होती है:

एक उच्च घातांक के साथ, 10²³ कहें कि यदि कम से कम महत्वपूर्ण बिट को बदल दिया जाए, तो दो आसन्न डिस्टिंघुबल संख्याओं के बीच एक बड़ा अंतर दिखाई देता है। इसके अलावा आधार 2 दशमलव बिंदु बनाता है कि कई आधार 10 संख्याओं को केवल अनुमानित किया जा सकता है; 1/5, 1/10 अंतहीन संख्या है।

इसलिए सामान्य तौर पर : फ्लोटिंग पॉइंट नंबरों का उपयोग नहीं किया जाना चाहिए यदि आप महत्वपूर्ण अंकों की परवाह करते हैं। गणना के साथ मौद्रिक राशियों के लिए, ई, ए, बिगडेसीमल का सबसे अच्छा उपयोग करते हैं ।

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


3

फ्लोटिंग पॉइंट नंबर एक घातीय रूप का उपयोग करके एन्कोड किए गए हैं, जो कुछ ऐसा है m * b ^ e, जैसे कि पूर्णांक की तरह नहीं। आपके द्वारा पूछा गया प्रश्न निश्चित बिंदु संख्याओं के संदर्भ में सार्थक होगा । कई निश्चित बिंदु अंकगणितीय पुस्तकालय उपलब्ध हैं।

फ्लोटिंग पॉइंट अंकगणित के बारे में: दशमलव अंकों की संख्या प्रस्तुति और संख्या प्रणाली पर निर्भर करती है। उदाहरण के लिए आवधिक संख्याएँ ( 0.33333) हैं, जिनकी दशमलव में परिमित प्रस्तुति नहीं है, लेकिन बाइनरी में एक है और इसके विपरीत।

यह भी ध्यान देने योग्य है कि फ्लोटिंग पॉइंट नंबर्स एक निश्चित बिंदु तक एक अंतर से अधिक होता है, यानी value + 1पैदावार value, क्योंकि value + 1इसका उपयोग करके एन्कोड नहीं किया जा सकता है m * b ^ e, जहां m, bऔर eलंबाई में तय किए गए हैं। वही 1 से छोटे मानों के लिए होता है, यानी सभी संभावित कोड बिंदुओं में समान दूरी नहीं होती है।

इस वजह से nनिश्चित अंकों की तरह सटीक अंकों की कोई सटीकता नहीं है, क्योंकि nदशमलव अंकों वाले प्रत्येक नंबर में IEEE एन्कोडिंग नहीं है।

लगभग एक अनिवार्य दस्तावेज़ है जिसे आपको तब पढ़ना चाहिए जो फ़्लोटिंग पॉइंट नंबरों की व्याख्या करता है: फ़्लोटिंग पॉइंट अंकगणित के बारे में हर कंप्यूटर वैज्ञानिक को क्या पता होना चाहिए


2
+1 का उल्लेख करने के लिए "फ्लोटिंग पॉइंट अंकगणित के बारे में हर कंप्यूटर वैज्ञानिक को क्या पता होना चाहिए"। हालांकि, यह ध्यान देने योग्य है कि प्रत्येक संख्या जिसमें एक परिमित बाइनरी अंश प्रतिनिधित्व है, एक परिमित दशमलव प्रतिनिधित्व भी है। समस्या केवल दशमलव से बाइनरी तक जा रही है।
पेट्रीसिया शहनाहन

1

देखो Float.intBitsToFloatऔर Double.longBitsToDouble, किस तरह की व्याख्या कैसे बिट्स फ्लोटिंग-पॉइंट संख्याओं के अनुरूप हैं। विशेष रूप से, एक सामान्य के टुकड़े floatकुछ दिखते हैं

 s * 2^exp * 1.ABCDEFGHIJKLMNOPQRSTUVW

जहां A ... W 23 बिट्स हैं - 0s और 1s - बाइनरी में एक अंश का प्रतिनिधित्व करते हैं - s +/- 1 है, क्रमशः 0 या 1 द्वारा दर्शाया गया है, और ऍक्स्प एक हस्ताक्षरित 8-बिट पूर्णांक है।

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