2012-04-30 22 views
5

Tất cả các số trong Javascript là 64 bit (8 byte) số dấu phẩy động nhưng tại sao phạm vi hiệu quả của JavaScript là 5e-324 (âm) thành 1.7976931348623157e + 308 (dương)?Số trong Javascript và phạm vi hiệu dụng

+0

Từ tất cả các giá trị có thể, 9007199254740990 trong số chúng được thể hiện dưới dạng NaN (Không phải số). –

+0

edwardpku, bạn có lẽ nên chấp nhận câu trả lời của MДΓΓ БДLL hoặc của tôi (tùy thuộc vào việc bạn tìm thấy một con trỏ đến spec hay giải thích lý do tại sao spec nói rằng, hữu ích hơn). –

+0

cảm ơn, Gareth. : D – edwardpku

Trả lời

8

Vì đó là số 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

+ Thông báo đặc biệt là mantissa 52 bit trong tham chiếu. –

4

Do giá trị không chuẩn; xem ví dụ http://en.wikipedia.org/wiki/Denormal_number. Các giá trị này mở rộng phạm vi các giá trị dấu phẩy động để cho phép các giá trị gần bằng không hơn nếu không thì sẽ có thể.

Bạn sẽ được khuyên nên coi đây là chi tiết triển khai có mục đích là thực hiện các phép tính với kết quả trung gian rất nhỏ không hoạt động quá mức; khi bạn sử dụng những giá trị rất nhỏ này, một số độ chính xác bị mất.