पहले से कई जवाब परिणाम से पता चला है true
की 9007199254740992 === 9007199254740992 + 1
सत्यापित करने के लिए 9 007 199 254 740 991 अधिकतम और सुरक्षित पूर्णांक है।
क्या होगा अगर हम संचय करते रहें:
input: 9007199254740992 + 1 output: 9007199254740992 // expected: 9007199254740993
input: 9007199254740992 + 2 output: 9007199254740994 // expected: 9007199254740994
input: 9007199254740992 + 3 output: 9007199254740996 // expected: 9007199254740995
input: 9007199254740992 + 4 output: 9007199254740996 // expected: 9007199254740996
हम पता लगा है कि तुलना में संख्या के बीच अधिक से अधिक 9 007 199 254 740 992 , केवल भी नंबर दिए गए हैं प्रदर्शनीय ।
यह समझाने के लिए एक प्रवेश द्वार है कि डबल-परिशुद्धता 64-बिट बाइनरी प्रारूप इस पर कैसे काम करता है। आइए देखें कि इस द्विआधारी प्रारूप का उपयोग करके 9 007 199 254 740 992 का आयोजन (प्रतिनिधित्व) कैसे किया जाता है।
4 503 599 627 370 496 से प्रदर्शित करने के लिए एक संक्षिप्त संस्करण का उपयोग करना :
1 . 0000 ---- 0000 * 2^52 => 1 0000 ---- 0000.
|-- 52 bits --| |exponent part| |-- 52 bits --|
तीर के बाईं ओर, हमारे पास बिट मान 1 है , और एक आसन्न मूलांक बिंदु है , फिर गुणा करके 2^52
, हम सही मूलांक 52 चरण को स्थानांतरित करते हैं, और यह अंत में जाता है। अब हमें बाइनरी में 4503599627370496 मिलते हैं।
अब हम 1 को इस मान पर जमा करना शुरू करते हैं जब तक कि सभी बिट्स 1 पर सेट नहीं हो जाते हैं, जो दशमलव में 9 007 199 254 740 991 के बराबर है ।
1 . 0000 ---- 0000 * 2^52 => 1 0000 ---- 0000.
(+1)
1 . 0000 ---- 0001 * 2^52 => 1 0000 ---- 0001.
(+1)
1 . 0000 ---- 0010 * 2^52 => 1 0000 ---- 0010.
(+1)
.
.
.
1 . 1111 ---- 1111 * 2^52 => 1 1111 ---- 1111.
अब, क्योंकि दोहरे-सटीक 64-बिट बाइनरी प्रारूप में , यह कड़ाई से अंश के लिए 52 बिट्स आवंटित करता है , एक और 1 को जोड़ने के लिए और अधिक बिट उपलब्ध नहीं है, इसलिए हम क्या कर सकते हैं सभी बिट्स को 0 पर सेट करें, और घातांक भाग में हेरफेर करें:
|--> This bit is implicit and persistent.
|
1 . 1111 ---- 1111 * 2^52 => 1 1111 ---- 1111.
|-- 52 bits --| |-- 52 bits --|
(+1)
(radix point has no way to go)
1 . 0000 ---- 0000 * 2^52 * 2 => 1 0000 ---- 0000. * 2
|-- 52 bits --| |-- 52 bits --|
=> 1 . 0000 ---- 0000 * 2^53
|-- 52 bits --|
अब हमें ९ ०० 199 ९९ २५४ ४ ९९ ९९ २ मिलता है , और इससे अधिक संख्या के साथ, प्रारूप जो पकड़ सकता है वह अंश का २ गुना है , इसका मतलब है कि अब अंश पर हर 1 जोड़ वास्तव में 2 जोड़ के बराबर है, यही कारण है कि डबल -परिचय 64-बिट बाइनरी प्रारूप विषम संख्याओं को धारण नहीं कर सकता है जब संख्या 9 007 199 254 740 992 से अधिक है :
(consume 2^52 to move radix point to the end)
1 . 0000 ---- 0001 * 2^53 => 1 0000 ---- 0001. * 2
|-- 52 bits --| |-- 52 bits --|
जब संख्या 9 007 199 254 740 992 * 2 = 18 014 398 509 481 984 से अधिक हो जाती है, तो केवल 4 बार अंश का आयोजन किया जा सकता है:
input: 18014398509481984 + 1 output: 18014398509481984 // expected: 18014398509481985
input: 18014398509481984 + 2 output: 18014398509481984 // expected: 18014398509481986
input: 18014398509481984 + 3 output: 18014398509481984 // expected: 18014398509481987
input: 18014398509481984 + 4 output: 18014398509481988 // expected: 18014398509481988
कैसे [ 2 251 799 813 685 248 के बीच की संख्या , 4 503 599 627 370 496 ) के ?
1 . 0000 ---- 0001 * 2^51 => 1 0000 ---- 000.1
|-- 52 bits --| |-- 52 bits --|
मूलांक 1 के बाद का बिट मान 2 ^ -1 है। (= 1/2, = 0.5) इसलिए जब संख्या 4 503 599 627 370 496 से कम हो 1/2 (2 ^ 52) से कम हो, तो पूर्णांक के 1/2 बार का प्रतिनिधित्व करने के लिए एक बिट उपलब्ध है :
input: 4503599627370495.5 output: 4503599627370495.5
input: 4503599627370495.75 output: 4503599627370495.5
से कम 2 251 799 813 685 248 (2 ^ 51)
input: 2251799813685246.75 output: 2251799813685246.8 // expected: 2251799813685246.75
input: 2251799813685246.25 output: 2251799813685246.2 // expected: 2251799813685246.25
input: 2251799813685246.5 output: 2251799813685246.5
// If the digits exceed 17, JavaScript round it to print it.
//, but the value is held correctly:
input: 2251799813685246.25.toString(2)
output: "111111111111111111111111111111111111111111111111110.01"
input: 2251799813685246.75.toString(2)
output: "111111111111111111111111111111111111111111111111110.11"
input: 2251799813685246.78.toString(2)
output: "111111111111111111111111111111111111111111111111110.11"
और घातांक भाग की उपलब्ध सीमा क्या है ? प्रारूप इसके लिए 11 बिट्स आवंटित करता है। विकी से पूरा प्रारूप : (अधिक जानकारी के लिए कृपया वहां जाएं)
तो घातांक का भाग 2 ^ 52 होने के लिए, हमें वास्तव में e = 1075 सेट करने की आवश्यकता है।