Các công cụ JS có được phép thay đổi các bit của NaN không?


12

Trong JavaScript, giá trị NaN có thể được biểu thị bằng một phạm vi rộng gấp đôi 64 bit trong nội bộ. Cụ thể, bất kỳ gấp đôi với biểu diễn bitwise sau:

x111 1111 1111 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx

Được hiểu là NaN. Câu hỏi của tôi là: giả sử tôi đã truyền hai gợi ý 32 bit cho Số JS bằng ArrayBuffers, chuyển nó xung quanh, sau đó chuyển nó trở lại thành hai gợi ý 32 bit. Các bit được phục hồi sẽ giống như các bản gốc hay các công cụ JS được phép thay đổi các bit của NaN theo ý muốn? Nói cách khác, số JS có thể được sử dụng để lưu trữ 64 bit không?


2
Ý tưởng thú vị
Evert

1
Một bài kiểm tra tôi đã thực hiện. Có vẻ như ít nhất Node.js thay đổi các bit theo ý muốn, gây mất thông tin.
MaiaVictor

1
Ngoài ra: Không phải mọi mẫu bit như vậy đại diện cho một NaN. Nếu tất cả x buts sau lần đầu tiên bằng 0, nó đại diện cho một vô cực.
Eric Postpischil

Câu trả lời:


6

ECMA-262 Phiên bản thứ 9 , tháng 6 năm 2018, (tiêu chuẩn mà JavaScript dự định tuân thủ) cho biết, trong 6.1.6.

Giá trị 9007199254740990 (nghĩa là 2 53 -2) khác biệt Các giá trị không phải là số một của các tiêu chuẩn IEEE được biểu thị trong ECMAScript dưới dạng một giá trị NaN đặc biệt duy nhất. giữa các giá trị Not-a-Number khác nhau, nhưng hành vi đó phụ thuộc vào việc triển khai; đối với mã ECMAScript, tất cả các giá trị NaN không thể phân biệt được với nhau.

24.1.17 Số NumberToRawBytes (loại, giá trị, isLittleEndian), nói:

Nếu giá trị là NaN, rawBytes có thể được đặt thành bất kỳ triển khai nào được chọn theo định dạng nhị phân IEEE 754-2008, mã hóa Not-a-Number. Việc triển khai phải luôn luôn chọn cùng một mã hóa cho mỗi giá trị NaN có thể phân biệt được.

Tôi không thấy bất kỳ đoạn nào khác đề cập đến NaN đang chiếu sáng câu hỏi này. Một mặt, 24.1.17 cho chúng ta biết một cách hiệu quả các bit của NaN phải được bảo toàn khi chuyển đổi NaN thành byte thô. Tuy nhiên, không có gì khác xuất hiện để cho chúng ta biết các bit phải được bảo toàn trong các hoạt động khác. Người ta có thể suy luận rằng đây là ý định, bởi vì yêu cầu này trong 24.1.17 sẽ không phục vụ mục đích nếu các bit có thể được thay đổi tùy ý bởi bất kỳ hoạt động nào khác. Nhưng tôi sẽ không dựa vào các triển khai JavaScript để thực hiện điều này phù hợp với mục đích đó.


1

Tôi đã từng hỏi một câu hỏi cho Java, về sự phụ thuộc vào phần cứng của các giá trị NaN và nhận thấy rằng một số CPU sẽ âm thầm chuyển đổi "NaN báo hiệu" thành "NaN yên tĩnh" (đặt bit NaN yên tĩnh) khi tải giá trị NaN vào một thanh ghi bộ xử lý. Vì vậy, ít nhất một trong số các bit, bit NaN yên tĩnh, bạn không thể sử dụng để lưu trữ dữ liệu tùy ý.

Sử dụng các bit khác, miễn là bit NaN yên tĩnh được đặt, có thể an toàn. Nhưng dường như vẫn còn chỗ cho sự phụ thuộc vào việc thực hiện ở đây, và do đó không có gì đảm bảo.

Loại vấn đề này là lý do tại sao các hoạt động ngôn ngữ bình thường tránh làm bất cứ điều gì phụ thuộc vào giá trị bên trong của NaN và thích coi tất cả các NaN là "chỉ NaN".


0

Tiêu chuẩn IEEE-754 ban đầu cố tình để lại các bit của NaN cho đến khi thực hiện. Nó đã cung cấp gợi ý, chẳng hạn như

Bạn có thể đặt địa chỉ bộ nhớ ban đầu nơi NaN được tạo.

Trong khi đó, số học có các quy tắc cụ thể về việc phải làm gì với NaN và điều đó không liên quan gì đến các bit ở phía dưới. Tôi không nghĩ nó thậm chí còn nói phải làm gì khi thêm hai NaN - giữ các bit từ một trong số chúng so với tạo ra một tập hợp bit khác. Chỉ là kết quả vẫn phải là NaN.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.