是否允许JS引擎更改NaN的位?

问题描述 投票:6回答:1

在JavaScript中,NaN值可由内部广泛的64位double表示。具体来说,具有以下按位表示形式的任何double:

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

被解释为NaN。我的问题是:假设我使用ArrayBuffers将两个32位uint强制转换为一个JS Number,将其传递,然后将其强制转换为两个32位uint。恢复的位是否将与原始位相同,还是允许JS引擎随意更改NaN的位?换句话说,JS号可以用于无损地存储64位吗?

javascript ieee-754
1个回答
0
投票

ECMA-262 9 th版,2018年6月,(JavaScript旨在遵循的标准)在6.1.6“数字类型”中说:]]

…9007199254740990(即2 53

-2)IEEE标准的不同“非数字”值在ECMAScript中表示为单个特殊的NaN值。…在某些实现中,外部代码可能能够检测到各种非数字值之间的差异,但是这种行为取决于实现;对于ECMAScript代码,所有NaN值彼此之间是无法区分的。

24.1.17“ NumberToRawBytes(类型,值,isLittleEndian)”说:]]

…如果值为NaN,则可以将rawBytes设置为选择的IEEE 754-2008 binary64格式非数字编码的任何实现。一个实现必须始终为每个实现可区分的NaN值选择相同的编码。…

我没有看到其他提及NaN的段落阐明了这个问题。一方面,24.1.17有效地告诉我们将NaN转换为原始字节时必须保留NaN的位。但是,似乎没有什么可以告诉我们在其他操作中必须保留这些位。可能会推断出这是目的,因为如果可以通过任何其他操作任意更改这些位,则24.1.17中的这一要求将毫无用处。但是我不会依赖JavaScript实现来实现此目的。

© www.soinside.com 2019 - 2024. All rights reserved.