JavaScript'teki sayılar IEEE-754 çift duyarlıklı ikili kayan nokta, hızlı hesaplamalar ve geniş bir aralık sağlayan oldukça kompakt bir biçimdir (64 bit). Bunu, sayıyı bir işaret biti, 11 bitlik bir üs ve 52 bitlik bir anlamlılık olarak saklayarak yapar (zekâ sayesinde aslında 53 bitlik kesinlik elde etmesine rağmen). Bu var ikili significand (artı bazı zeka) bize değer verir ve üs bize sayısının büyüklüğünü verir: (baz 2) kayan nokta.
Doğal olarak, sadece bu kadar çok önemli bit ile her sayı saklanamaz. Burada 1 sayısı ve formatın saklayabileceği 1'den sonraki en yüksek sayı, 1 + 2 -52 ≈ 1.00000000000000022 ve bundan sonraki en yüksek 1 + 2 × 2 -52 ≈ 1.00000000000000044:
+ ------------------------------------------------- -------------- işaret biti
/ + ------- + ---------------------------------------- -------------- üs
/ / | + ------------------------------------------------- + - anlamlı
/ / | / |
0 01111111111 0000000000000000000000000000000000000000000000000000
= 1
0 01111111111 000000000000000000000000000000000000000000000000000001
≈ 1.00000000000000022
0 01111111111 0000000000000000000000000000000000000000000000000010
≈ 1.00000000000000044
1.00000000000000022'den 1.00000000000000044'e atlamayı unutmayın; 1.0000000000000003'ü saklamanın bir yolu yoktur. Bu, tamsayılarla da olabilir: Number.MAX_SAFE_INTEGER(9,007,199,254,740,991), formatın tutabileceği ive i + 1her ikisi de tam olarak gösterilebilir ( spec ) olan en yüksek pozitif tam sayı değeridir . Hem 9,007,199,254,740,991 hem de 9,007,199,254,740,992 temsil edilebilir, ancak sonraki tam sayı olan 9,007,199,254,740,993 gösterilemez; 9.007.199.254.740.992'den sonra temsil edebileceğimiz bir sonraki tam sayı 9.007.199.254.740.994'tür. İşte bit kalıpları, en sağdaki (en az önemli) biti not edin:
+ ------------------------------------------------- -------------- işaret biti
/ + ------- + ---------------------------------------- -------------- üs
/ / | + ------------------------------------------------- + - anlamlı
/ / | / |
0 10000110011 1111111111111111111111111111111111111111111111111111
= 9007199254740991 (Sayı.MAX_SAFE_INTEGER)
0 10000110100 0000000000000000000000000000000000000000000000000000
= 9007199254740992 (Sayı.MAX_SAFE_INTEGER + 1)
x xxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
9007199254740993 (Number.MAX_SAFE_INTEGER + 2) depolanamaz
0 10000110100 000000000000000000000000000000000000000000000000000001
= 9007199254740994 (Sayı.MAX_SAFE_INTEGER + 3)
Unutmayın, format 2 tabanlıdır ve bu üs ile en önemsiz bit artık kesirli değildir; 2 değerine sahiptir. Kapalı (9,007,199,254,740,992) veya açık (9,007,199,254,740,994) olabilir; yani bu noktada, tam sayı (tamsayı) ölçeğinde bile hassasiyeti kaybetmeye başladık. Döngümüz için etkileri var!
i = 9,007,199,254,740,992Döngüyü tamamladıktan sonra i++bize i = 9,007,199,254,740,992tekrar verir ; herhangi bir değişiklik yoktur i, çünkü bir sonraki tamsayı saklanamaz ve hesaplama aşağı yuvarlanır. iyapsaydık değişirdi i += 2, ama i++değiştiremeyiz. Böylece kararlı duruma ulaştık: iasla değişmez ve döngü asla sona ermez.