Önceki zamanlardan daha fazla cevaplar sonucunu göstermiştir true
ait 9007199254740992 === 9007199254740992 + 1
olduğunu doğrulamak için 9 007 199 254 740 991 maksimum ve güvenli tam sayıdır.
Ya biriktirmeye devam edersek:
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
9007 199 254 740 992'den büyük sayılar arasında sadece çift sayıların temsil edilebildiğini görebiliriz .
Bu, çift duyarlıklı 64 bit ikili formatın bu konuda nasıl çalıştığını açıklayan bir giriş . Şimdi bu ikili formatı kullanarak 9 007 199 254 740 992'nin nasıl tutulduğunu (temsil edildiğini) görelim .
4 503 599 627 370 496'dan göstermek için kısa bir sürüm kullanma :
1 . 0000 ---- 0000 * 2^52 => 1 0000 ---- 0000.
|-- 52 bits --| |exponent part| |-- 52 bits --|
Okun sol tarafında, bit değeri 1 ve bitişik bir yarıçap noktası var , daha sonra çarparak 2^52
, yarıçap noktasını 52 adım sağa hareket ettiriyoruz ve sonuna kadar gidiyor. Şimdi ikilide 4503599627370496 alıyoruz.
Şimdi, tüm bitler 1 olarak ayarlanana kadar 1'i bu değerde biriktirmeye başlıyoruz, bu da ondalık ondalık 9 007 199 254 740 991'e eşittir .
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.
Şimdi, çift duyarlıklı 64 bit ikili formatta , kesinlikle kesir için 52 bit ayırdığı için, bir tane daha 1 eklemek için daha fazla bit mevcut değildir, bu yüzden yapabileceğimiz tüm bitleri 0'a geri döndürmek ve üs kısmını manipüle etmek:
|--> 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 --|
Şimdi 9 007 199 254 740 992'yi alıyoruz ve sayıdan daha büyük bir sayı ile formatın tutabileceği kesirin 2 katı, şimdi kesir kısmındaki her 1 ekleme aslında 2 toplama anlamına geliyor, bu yüzden çift 6400 bit ikili biçim , sayı 9 007 199254 740 992'den büyük olduğunda tek sayıları tutamaz :
(consume 2^52 to move radix point to the end)
1 . 0000 ---- 0001 * 2^53 => 1 0000 ---- 0001. * 2
|-- 52 bits --| |-- 52 bits --|
Bu nedenle sayı 9007 199 254 740 992 * 2 = 18 014 398 509 481 984'den büyük olduğunda, kesirin sadece 4 katı tutulabilir:
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 251799813685248 , 4 503 599 627 370 496 ) arasındaki sayıya ne dersiniz ?
1 . 0000 ---- 0001 * 2^51 => 1 0000 ---- 000.1
|-- 52 bits --| |-- 52 bits --|
Yarıçap noktasından sonraki bit değeri 1 tam olarak 2 ^ -1'dir. (= 1/2 , = 0,5) Dolayısıyla, 4 503 599 627 370 496'dan (2 ^ 52) küçük bir sayı olduğunda, tamsayının 1/2 katını temsil etmek için bir bit vardır :
input: 4503599627370495.5 output: 4503599627370495.5
input: 4503599627370495.75 output: 4503599627370495.5
Az 2 251 799 813 685 248 (^ 51 2)
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"
Ve mevcut üs parçası aralığı nedir? biçim bunun için 11 bit ayırır. Komple biçimi Wiki : (daha fazla detay oraya gitmek için lütfen)
Bu nedenle üs parçasını 2 ^ 52 yapmak için tam olarak e = 1075 ayarlamamız gerekiyor.