在JavaScript中,NaN值可以在内部以64位双倍的范围表示.具体来说,有以下按位表示的任何双重表示:
x111 1111 1111 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx被解释为NaN。我的问题是:假设我使用ArrayBuffers将两个32位的uint转换为一个JS号,然后将其传递给另两个32位的uints。恢复的比特是否与原始位相同,或者JS引擎是否允许任意更改NaN的位?换句话说,JS数字能被用来存储64位的损失吗?
发布于 2019-11-08 15:26:29
我曾经向a question询问过关于NaN值的硬件依赖性的问题,并且注意到当一个NaN值加载到处理器寄存器中时,一些CPU会悄悄地将“信令NaN”转换为“安静的NaN”(设置安静的NaN位)。因此,至少有一个位,即安静的位,不能用于存储任意数据.
使用其他位,只要设置了安静的NaN位,可能是安全的。但是,这里似乎仍然有实施的空间--依赖,因此无法保证。
这类问题就是为什么普通的语言操作避免做任何依赖于NaN内部值的操作,而倾向于将所有的NaN视为“只是NaN”。
发布于 2022-06-10 11:01:22
根据IEEE-754标准,对于非信令NaNs,尾随位应该被保留,如果它们代表某种规范,则应该保留它们。
如果要传递浮点结果,则对于具有安静的
输入的操作(最大操作和最小操作除外),结果应该是一个安静的NaN,它应该是输入NaN之一。如果十进制输入NaN的尾随意义和字段是规范的,那么如果选择该NaN作为结果NaN,则将保留该字段的位模式。
我不会指望它的。至于领头牌,你绝对不能指望它。
对于所有其他操作,此标准不指定NaN结果的符号位,即使只有一个输入NaN,或者当NaN是从无效操作生成的。
发布于 2019-11-19 00:23:45
最初的IEEE-754标准故意将NaN的位数留给实现。它确实提供了一些提示,例如
您可以将创建NaN的位置的原始内存地址。
同时,算术对于如何处理NaN有特定的规则,这与底部的位没有任何关系。我认为它甚至没有说当添加两个NaNs时该做什么--让这些位元远离其中一个,而不是组成另一组位元。结果肯定仍然是一个NaN。
https://stackoverflow.com/questions/58756774
复制相似问题