Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取有效位的小数部分和符号位;";javascript编号NaN_Javascript_Floating Point_Double - Fatal编程技术网

获取有效位的小数部分和符号位;";javascript编号NaN

获取有效位的小数部分和符号位;";javascript编号NaN,javascript,floating-point,double,Javascript,Floating Point,Double,对于javascript中的NaN值(例如指数为11111),是否有任何方法可以获取符号位和有效值(忽略隐式1位) 如果不是这样,这是否意味着javascript中的double(Number)并不代表2^64可能的状态,而是(2^64-2^52)可能的状态?正如异端猴子所指出的,规范明确指出javascript中的NaN数字都是不可区分的- 在某些实现中,外部代码可能能够检测到各种非数字值之间的差异,但这种行为取决于实现;对于ECMAScript代码,所有NaN值彼此都无法区分 所以看起来这

对于javascript中的
NaN
值(例如指数为11111),是否有任何方法可以获取符号位和有效值(忽略隐式1位)


如果不是这样,这是否意味着javascript中的
double(Number)
并不代表
2^64
可能的状态,而是(
2^64-2^52
)可能的状态?

正如异端猴子所指出的,规范明确指出javascript中的NaN数字都是不可区分的-

在某些实现中,外部代码可能能够检测到各种非数字值之间的差异,但这种行为取决于实现;对于ECMAScript代码,所有NaN值彼此都无法区分

所以看起来这是不可能的——或者至少在平台独立的情况下是不可能的

一个建议是使用类型化数组。这似乎适用于IE和Chrome,但不适用于firefox!问题是当你将double存储在一个变量中时,在firefox中它会丢失你为NaN值设置的所有位模式

var buffer=newarraybuffer(8);
var floats=新的Float64Array(缓冲区);
var字节=新的Uint8Array(缓冲区);
浮点数[0]=NaN;
var print\u float\u bytes=函数(){
var pstr=“”;
对于(变量i=0;i<8;i+=1){
pstr=pstr+“”+字节[i];
}
控制台日志(pstr);
};
console.log(“打印新的NaN”);
打印浮点字节();
字节[7]=255;
log(“打印符号位为1的NaN”);
打印浮点字节();
字节[0]=1;
log(“打印有效位为略大于1的数字并带有正号的NaN”);
打印浮点字节();
log(“打印浮点数:+floats[0]);
var p=浮动[0];
浮点数[0]=p;
console.log(“打印往返NaN”);
打印浮点字节();
变量无意义=函数(pdbl){
返回pdbl;
};
p=浮动[0];
p=无意义(p);
浮点数[0]=p;
log(“打印更多的往返NaN”);

打印浮点字节()可以使用类型化数组来获取数字的位。用一个元素创建一个Float64类型的数组,并将数字放入其中。然后使用其缓冲区生成一个8长的UInt8数组,现在您可以通过8个字节中的每个字节查看位。请注意,
NaN
值可能被规范化为规范中所有可能的
NaN
中的某个特定值。(如果我没记错规范,我可能会把
NaNs
与非规范性混淆。)您可能希望阅读,其中写道,“在某些实现中,外部代码可能能够检测到各种非数字值之间的差异,但这种行为取决于实现;对于ECMAScript代码,所有NaN值彼此都无法区分。“至于你的第二个问题,答案与基于IEEE浮点的任何其他语言的答案相同,答案是“是”。并非所有的位模式都是有效的数字。@Pointy这是一个奇妙的想法,但这与异端猴子说的不一致吗?因此Firefox JavaScript引擎做了类似于“规范化”的事情。”
NaN
值?我想这可能会使其他一些代码更简单。是的,它是这样的,而且internet explorer的符号位默认为1。我不确定firefox为什么规范化NaN值,我认为这取决于您的机器(很可能是这样!)。