क्या एक फ्लोट में 32 बाइनरी अंक होते हैं और एक डबल में 64 बाइनरी अंक होते हैं? प्रलेखन भी समझ में मुश्किल था।
क्या सभी बिट्स महत्वपूर्ण अंकों में अनुवाद करते हैं? या दशमलव बिंदु का स्थान कुछ बिट्स लेता है?
क्या एक फ्लोट में 32 बाइनरी अंक होते हैं और एक डबल में 64 बाइनरी अंक होते हैं? प्रलेखन भी समझ में मुश्किल था।
क्या सभी बिट्स महत्वपूर्ण अंकों में अनुवाद करते हैं? या दशमलव बिंदु का स्थान कुछ बिट्स लेता है?
जवाबों:
फ्लोट : 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_ कंप्यूटर्स
double
और 7.2 के लिए float
, जो कि कहने के लिए 15 और 7. कुछ बड़ी संख्याओं को प्रत्येक मामले में दर्शाया जा सकता है, और इसमें से कोई भी अंशों पर लागू नहीं होता है, लेकिन इसके बारे में कोई 'औसत' नहीं है, और आपका कोई भी स्रोत नहीं कहता है अन्यथा।
लंबा जवाब:
फ्लोटिंग-पॉइंट नंबरों में तीन घटक होते हैं:
अनिवार्य रूप से, यह काम करता है 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 "इस नियम को मुख्य रूप से अग्रणी बिट कन्वेंशन, निहित बिट कन्वेंशन, या छिपे हुए बिट कन्वेंशन कहा जाता है।" ( विकिपीडिया )
से जावा विनिर्देश :
फ़्लोटिंग-पॉइंट प्रकार फ़्लोट और डबल हैं, जो वैचारिक रूप से एकल-सटीक 32-बिट और डबल-सटीक 64-बिट प्रारूप IEEE 754 के साथ जुड़े हुए हैं और IEEE मानक में बाइनरी फ़्लोटिंग-पॉइंट अंकगणित, ANSI / IEEE के लिए निर्दिष्ट किए गए हैं। मानक 754-1985 (IEEE, न्यूयॉर्क)।
जैसा कि IEEE754 बेसिक्स को समझने के बिना संख्याओं के साथ कुछ भी करना मुश्किल है, यहां एक और लिंक है ।
यह समझना महत्वपूर्ण है कि परिशुद्धता एक समान नहीं है और यह पूर्णांक के रूप में की गई संख्याओं का सटीक भंडारण नहीं है।
एक उदाहरण :
double a = 0.3 - 0.1;
System.out.println(a);
प्रिंट
0.19999999999999998
यदि आपको मनमाने ढंग से परिशुद्धता की आवश्यकता है (उदाहरण के लिए वित्तीय उद्देश्यों के लिए) तो आपको बिग दशमलव की आवश्यकता हो सकती है ।
एक सामान्य गणित उत्तर।
यह समझते हुए कि फ्लोटिंग पॉइंट नंबर को कुछ बिट्स के रूप में कार्यान्वित किया जाता है जो एक्सप्रेशन और बाकी का प्रतिनिधित्व करते हैं, अधिकांश अंकों के लिए (बाइनरी सिस्टम में), एक में निम्न स्थिति होती है:
एक उच्च घातांक के साथ, 10²³ कहें कि यदि कम से कम महत्वपूर्ण बिट को बदल दिया जाए, तो दो आसन्न डिस्टिंघुबल संख्याओं के बीच एक बड़ा अंतर दिखाई देता है। इसके अलावा आधार 2 दशमलव बिंदु बनाता है कि कई आधार 10 संख्याओं को केवल अनुमानित किया जा सकता है; 1/5, 1/10 अंतहीन संख्या है।
इसलिए सामान्य तौर पर : फ्लोटिंग पॉइंट नंबरों का उपयोग नहीं किया जाना चाहिए यदि आप महत्वपूर्ण अंकों की परवाह करते हैं। गणना के साथ मौद्रिक राशियों के लिए, ई, ए, बिगडेसीमल का सबसे अच्छा उपयोग करते हैं ।
के लिए भौतिक विज्ञान चल बिन्दु युगल पर्याप्त हैं, तैरता लगभग कभी नहीं। इसके अलावा प्रोसेसर का फ्लोटिंग पॉइंट पार्ट, एफपीयू, आंतरिक रूप से भी थोड़ा अधिक प्रिडिक्शन का उपयोग कर सकता है।
फ्लोटिंग पॉइंट नंबर एक घातीय रूप का उपयोग करके एन्कोड किए गए हैं, जो कुछ ऐसा है m * b ^ e
, जैसे कि पूर्णांक की तरह नहीं। आपके द्वारा पूछा गया प्रश्न निश्चित बिंदु संख्याओं के संदर्भ में सार्थक होगा । कई निश्चित बिंदु अंकगणितीय पुस्तकालय उपलब्ध हैं।
फ्लोटिंग पॉइंट अंकगणित के बारे में: दशमलव अंकों की संख्या प्रस्तुति और संख्या प्रणाली पर निर्भर करती है। उदाहरण के लिए आवधिक संख्याएँ ( 0.33333
) हैं, जिनकी दशमलव में परिमित प्रस्तुति नहीं है, लेकिन बाइनरी में एक है और इसके विपरीत।
यह भी ध्यान देने योग्य है कि फ्लोटिंग पॉइंट नंबर्स एक निश्चित बिंदु तक एक अंतर से अधिक होता है, यानी value + 1
पैदावार value
, क्योंकि value + 1
इसका उपयोग करके एन्कोड नहीं किया जा सकता है m * b ^ e
, जहां m
, b
और e
लंबाई में तय किए गए हैं। वही 1 से छोटे मानों के लिए होता है, यानी सभी संभावित कोड बिंदुओं में समान दूरी नहीं होती है।
इस वजह से n
निश्चित अंकों की तरह सटीक अंकों की कोई सटीकता नहीं है, क्योंकि n
दशमलव अंकों वाले प्रत्येक नंबर में IEEE एन्कोडिंग नहीं है।
लगभग एक अनिवार्य दस्तावेज़ है जिसे आपको तब पढ़ना चाहिए जो फ़्लोटिंग पॉइंट नंबरों की व्याख्या करता है: फ़्लोटिंग पॉइंट अंकगणित के बारे में हर कंप्यूटर वैज्ञानिक को क्या पता होना चाहिए ।
देखो Float.intBitsToFloat
और Double.longBitsToDouble
, किस तरह की व्याख्या कैसे बिट्स फ्लोटिंग-पॉइंट संख्याओं के अनुरूप हैं। विशेष रूप से, एक सामान्य के टुकड़े float
कुछ दिखते हैं
s * 2^exp * 1.ABCDEFGHIJKLMNOPQRSTUVW
जहां A ... W 23 बिट्स हैं - 0s और 1s - बाइनरी में एक अंश का प्रतिनिधित्व करते हैं - s +/- 1 है, क्रमशः 0 या 1 द्वारा दर्शाया गया है, और ऍक्स्प एक हस्ताक्षरित 8-बिट पूर्णांक है।