2012-04-30 13 views
5

Wszystkie liczby w kodzie JavaScript to 64-bitowe (8 bajtów) liczby zmiennoprzecinkowe , ale dlaczego efektywny zakres kodu JavaScript wynosi 5e-324 (ujemny) do 1,7976931348623157e + 308 (pozytywny)?Liczby w kodzie JavaScript i efektywny zakres

+0

Z wszystkich możliwych wartości, 9007199254740990 z nich są reprezentowane jako NaN (Nie liczba). –

+0

edwardpku, powinieneś zaakceptować odpowiedź MДΓΓ БДLL lub moją (w zależności od tego, czy znajdziesz wskaźnik do specyfikacji, czy też wyjaśnienie, dlaczego specyfikacja mówi, że jest bardziej pomocna). –

+0

dzięki, Gareth. : D – edwardpku

Odpowiedz

8

Bo to jest defined by the IEEE 754 spec.

0x 0000 0000 0000 0001 = 2⁻¹⁰²²⁻⁵² ≈ 4.9406564584124654 x 10⁻³²⁴ (Min subnormal positive double) 
0x 000f ffff ffff ffff = 2⁻¹⁰²² - 2⁻¹⁰²²⁻⁵² ≈ 2.2250738585072009 x 10⁻³⁰⁸ (Max subnormal positive double) 
0x 0010 0000 0000 0000 = 2⁻¹⁰²² ≈ 2.2250738585072014 x 10⁻³⁰⁸ (Min normal positive double) 
0x 7fef ffff ffff ffff = (1 + (1 - 2⁻⁵²)) x 2¹⁰²³ ≈ 1.7976931348623157 x 10³⁰⁸ (Max Double) 
+1

+ Zwróć uwagę zwłaszcza, że ​​52-bitowa mantysa w odnośniku. –

4

Ze względu na wartości denormalne; patrz np. http://en.wikipedia.org/wiki/Denormal_number. Rozszerzają one zakres wartości zmiennoprzecinkowych, aby umożliwić wartości bliższe zeru, niż byłoby to możliwe w innym przypadku.

Zaleca się, aby traktować je jako szczegół wdrożenia, którego celem jest uczynienie obliczeń z bardzo małymi pośrednimi wynikami, które nie zachowują się zbyt patologicznie; kiedy używasz tych bardzo małych wartości, traci się precyzję.