दिलचस्प पोस्ट
ArrayIndexOutOfBoundsException जब किसी सरणी के सभी तत्वों के जरिए घुमाने जाते हैं PHP: यदि इंटरनेट एक्सप्लोरर 6, 7, 8, या 9 जब कुछ परियोजनाएं कई समाधानों में शामिल की जाती हैं तो सभी समाधानों के लिए एक सामान्य नूग पैकेज फ़ोल्डर सेट करना JAX-RS वेब सेवाओं पर क्रॉस डोमेन अनुरोधों को कैसे सक्षम करें? एंड्रॉइड मूल बातें: यूआई थ्रेड में चल रहे कोड चेतावनी: mysql_fetch_array (): आपूर्ति तर्क एक मान्य MySQL परिणाम नहीं है UIStackView प्रोग्राम में दृश्य जोड़ें ट्विटर बूटस्ट्रैप पॉपओवर के अंदर फ़ायरबसे ऑफ़लाइन क्षमताएं और ऐडलिस्टनरफोरसिंलिंगवैल्यूइवेंट ऐसे फाइल को लोड नहीं कर सकता – rvm pkg install zlib का उपयोग करने के बाद भी zlib क्यों System.gc () कॉल करने के लिए खराब अभ्यास है? mutate_each / summarise_each in dplyr: मैं कुछ कॉलम कैसे चुनूं और उत्परिवर्तित कॉलम के नए नाम दें? क्यों strncpy असुरक्षित है? रिवर्स इंजीनियरिंग से एनएटीटी कोड को सुरक्षित रखें? रेगेक्स – क्या हाइफ़न बच जाएंगे?

सबसे बड़ा पूर्णांक जो एक डबल में संग्रहीत किया जा सकता है

क्या सबसे बड़ा "नो फ्लोटिंग" पूर्णांक है जिसे आईईईई 754 डबल टाइप में खोया जा सकता है बिना परिशुद्धता खोया जा सकता है?

वेब के समाधान से एकत्रित समाधान "सबसे बड़ा पूर्णांक जो एक डबल में संग्रहीत किया जा सकता है"

सबसे बड़ी / सबसे बड़ी पूर्णांक जिसे सटीक खोए बिना डबल में जमा किया जा सकता है वह डबल के सबसे बड़े संभावित मूल्य के समान है। यही है, DBL_MAX या लगभग 1.8 × 10 308 (यदि आपका डबल एक आईईईई 754 64-बिट डबल है)। यह एक पूर्णांक है यह वास्तव में प्रतिनिधित्व किया है आपको और क्या चाहिए?

आगे बढ़ें, मुझसे पूछें कि सबसे बड़ा पूर्णांक क्या है, जैसे कि यह और सभी छोटे पूर्णांक को आईईईई 64-बिट डबल्स में सटीक खोए बिना जमा किया जा सकता है। एक आईईईई 64-बिट डबल 52 बिट्स मैंटिसा है, इसलिए मुझे लगता है कि यह 2 53 :

  • 2 53 + 1 को संग्रहीत नहीं किया जा सकता है, क्योंकि शुरुआत में 1 और अंत में 1 के बीच में बहुत सारे शून्य हैं।
  • 2 53 से कम कुछ भी संग्रहीत किया जा सकता है, जिसमें 52 बिट्स को स्पष्ट रूप से मंटिसा में संग्रहीत किया जाता है, और फिर प्रभाव में प्रतिपादक आपको दूसरा एक देता है।
  • 2 53 स्पष्ट रूप से संग्रहीत किया जा सकता है, क्योंकि यह 2 की एक छोटी सी शक्ति है

या इसे देखने का एक और तरीका: एक बार पूर्वाग्रह को एक्सपोनेंट से हटा दिया गया है, और साइन बिट को इस सवाल के लिए अप्रासंगिक के रूप में अनदेखा कर दिया गया है, तो डबल के द्वारा संग्रहीत मान 2 की शक्ति है, और 2 से गुणा करके 52-बिट पूर्णांक प्रतिपादक – 52 तो एक्सपोनेंट 52 के साथ आप सभी मूल्यों को 2 52 से 2 53 – 1 तक स्टोर कर सकते हैं। फिर एक्सपोनेंट 53 के साथ, अगली संख्या जिसे आप 2 53 के बाद रख सकते हैं 2 53 + 1 × 2 53 – 52 तो पहली बार सटीकता का नुकसान 2 53 + 1 के साथ होता है

9007199254740992 (9,007,199,254,740,992) की कोई गारंटी नहीं है 🙂

कार्यक्रम

 #include <math.h> #include <stdio.h> int main(void) { double dbl = 0; /* I started with 9007199254000000, a little less than 2^53 */ while (dbl + 1 != dbl) dbl++; printf("%.0f\n", dbl - 1); printf("%.0f\n", dbl); printf("%.0f\n", dbl + 1); return 0; } 

परिणाम

 9007199254740991
 9007199254740992
 9007199254740992

आईईईई 754 के लिंक के साथ विकिपीडिया को एक ही संदर्भ में यह कहना है:

एक ठेठ कंप्यूटर सिस्टम पर, एक 'दोहरी सटीक' (64-बिट) बाइनरी फ़्लोटिंग-पॉइंट संख्या में 53 बिट्स का एक गुणांक (जिसमें से एक निहित है), 11 बिट के एक एक्सपोनेंट और एक साइन बिट है।

2 ^ 53 बस 9 * 10 ^ 15 से अधिक है

सबसे बड़ा पूर्णांक जो आईईईई 754 डबल (64-बिट) में प्रदर्शित किया जा सकता है वह सबसे बड़ा मूल्य है जो कि प्रकार का प्रतिनिधित्व कर सकता है, क्योंकि वह मान स्वयं एक पूर्णांक है

इसे 0x7FEFFFFFFFFFFFFF रूप में 0x7FEFFFFFFFFFFFFF , जो 0x7FEFFFFFFFFFFFFF से बना है:

  • 1 (नकारात्मक) की तुलना में साइन बिट 0 (पॉजिटिव)
  • 0x7FF (2047 जो कि एक NaN या अनन्तता दर्शाता है) के बजाय अधिकतम एक्सपोनेंट 0x7FE (2046 जो पूर्वाग्रह के बाद 1023 का प्रतिनिधित्व करता है) घटाया गया है।
  • अधिकतम मंथिसा 0xFFFFFFFFFFFFF जो कि 52 बिट्स 1 है।

द्विआधारी में, मान निहित है, इसके बाद प्रत्यारोपण से मंटिसा के दूसरे 52 लोग, 971 शून्य (1023 – 52 = 9 71)

सही दशमलव मान है:

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

यह लगभग 1.8 x 10 308 है

आपको मांटिसा के आकार को देखने की जरूरत है एक आईईईई 754 64 बिट फ्लोटिंग प्वाइंट नंबर (जो कि 52 बिट्स, प्लस 1 इन्सियल है) वास्तव में पूर्णांक को 2 ^ 53 से कम या बराबर के पूर्ण मूल्य के साथ प्रदर्शित कर सकते हैं।

<float.h> से <float.h> को उस कम से कम एक उचित सन्निकटन देना चाहिए चूंकि उस दशमलव अंक के साथ सौदा है, और यह वास्तव में बाइनरी में संग्रहीत है, आप संभवतः सटीकता को खोए बिना कुछ बड़ा संग्रह कर सकते हैं, लेकिन वास्तव में यह कहना कितना मुश्किल है मुझे लगता है आपको इसे FLT_RADIX और DBL_MANT_DIG से FLT_RADIX सक्षम होना चाहिए, लेकिन मुझे यकीन नहीं है कि मैं परिणाम पर पूरी तरह भरोसा करूँगा।