คำตอบมากมายจากก่อนหน้านี้แสดงให้เห็นผลลัพธ์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และจุด radix ที่อยู่ติดกันจากนั้นโดยการคูณ2^52
เราไปทางขวาย้ายจุด radix 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 --|
ทีนี้เราได้ 9 9 007 199 254 740 992และด้วยจำนวนที่มากกว่านั้นรูปแบบที่สามารถเก็บได้คือเศษส่วน 2 เท่านั่นหมายความว่าตอนนี้ทุก ๆ 1 ส่วนของเศษส่วนเท่ากับ 2 บวกนั่นคือสาเหตุที่สอง -precision รูปแบบไบนารี 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 หลังจากจุด radix คือ 2 ^ -1 (= 1/2, = 0.5) ดังนั้นเมื่อจำนวนที่น้อยกว่า4 503 599 627 370 496 (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 บิตสำหรับมัน รูปแบบที่สมบูรณ์จากWiki : (สำหรับรายละเอียดเพิ่มเติมกรุณาไปที่นั่น)
ดังนั้นเพื่อให้ส่วนเลขชี้กำลังเป็น 2 ^ 52 เราต้องตั้ง e = 1075