Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.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 有没有办法查看node js如何在内部存储数字?_Javascript_Node.js_Floating Point - Fatal编程技术网

Javascript 有没有办法查看node js如何在内部存储数字?

Javascript 有没有办法查看node js如何在内部存储数字?,javascript,node.js,floating-point,Javascript,Node.js,Floating Point,我正在努力提高对节点中浮点的理解。我的理解是,javascript中的每个数字都存储为64位浮点(这有点疯狂,也很酷),我想稍微处理一下 有没有一种简单的方法可以打印出任意数字的内部存储方式?类似于(5).tofloatrepression()的内容,它将返回101… 我在网上四处寻找,什么也找不到——如果我错过了一些明显的东西,我道歉 我知道我可以编写一个函数来实现这一点,但我对从另一个角度看问题感兴趣 谢谢 下面是如何获得浮点数的可视化: 函数getBinaryRepresentation

我正在努力提高对节点中浮点的理解。我的理解是,javascript中的每个数字都存储为64位浮点(这有点疯狂,也很酷),我想稍微处理一下

有没有一种简单的方法可以打印出任意数字的内部存储方式?类似于(5).tofloatrepression()的内容,它将返回
101…

我在网上四处寻找,什么也找不到——如果我错过了一些明显的东西,我道歉

我知道我可以编写一个函数来实现这一点,但我对从另一个角度看问题感兴趣


谢谢

下面是如何获得浮点数的可视化:

函数getBinaryRepresentation(num){ //以浮点数存储 var buffer=new Float64Array([num]).buffer; //检索为无符号字节 var视图=新的Uint8Array(缓冲区); //将字节转换为字符串(二进制表示) 返回视图。还原右侧( (arr,n)=>arr.concat(('0000000'+n.toString(2)).substr(-8)),[] ).加入(“”); } 函数格式浮点位(num){ 变量位=getBinaryRepresentation(num); //在不同部分之间留出空间: //-符号(1位) //-指数,带偏差(11位) //-有效位(52位),无最高有效位1 返回位[0]+''+位片(1,12)+''+位片(12); } 函数打印(num){ log(formatFloatBits(num)); } //示例: 打印(0); 印刷品(2); 印刷品(2.1); 印刷品(7);
印刷品(-7)以下是如何获得浮点数的可视化:

函数getBinaryRepresentation(num){ //以浮点数存储 var buffer=new Float64Array([num]).buffer; //检索为无符号字节 var视图=新的Uint8Array(缓冲区); //将字节转换为字符串(二进制表示) 返回视图。还原右侧( (arr,n)=>arr.concat(('0000000'+n.toString(2)).substr(-8)),[] ).加入(“”); } 函数格式浮点位(num){ 变量位=getBinaryRepresentation(num); //在不同部分之间留出空间: //-符号(1位) //-指数,带偏差(11位) //-有效位(52位),无最高有效位1 返回位[0]+''+位片(1,12)+''+位片(12); } 函数打印(num){ log(formatFloatBits(num)); } //示例: 打印(0); 印刷品(2); 印刷品(2.1); 印刷品(7); 印刷品(-7) 我的理解是javascript中的每个数字都存储为64位浮点

有点,有点,不完全是。数字的内部表示相当复杂。最初,V8(JavaScript引擎节点js构建于此)在内部使用标记指针

诀窍在于,64位机器上的指针以这样一种方式对齐,即至少三个有效位为0。因此,您可以在指针本身中存储附加信息(例如,它是指针还是整数)

所以V8将整数和指针存储在堆栈上,在相同的64位空间中。请注意,由于最后一位用作标志,因此V8中的整数最多为61位(而AFAIK仅为32位?)。另一方面,double作为单独的对象存储在堆上

另一方面,WebKit实现现在使用所谓的nan-boxing,它将指针存储在double中。这源于观察到NaN具有不同的表示形式。您可能会问,如何在53位中存储64位指针(实际上是61位指针)?你可以,因为目前(也就是说,由于ram的大小很小),只使用了48位

因此,在WebKit中,整数确实存储为双精度。但是WebKit也在堆栈上存储了小整数(作为适当的整数类型),以便在循环和索引中使用它们。这是因为整数运算仍然至少和浮点运算一样快,而且在许多情况下更快

这里有一篇有趣的文章(虽然已经过时了),你可能想读一下:

有没有一种简单的方法可以打印出任意数字的内部存储方式

不,实际上根本没有办法。正如我提到的,这完全取决于JavaScript引擎,规范中没有API来检索这些信息。你可以试着去读

我知道我可以写一个函数来实现这一点

你不能。反正不是用JavaScript。除非我真的误解了这个问题。内部表示和您在JavaScript中看到的是两个不同的世界

我的理解是javascript中的每个数字都存储为64位浮点

有点,有点,不完全是。数字的内部表示相当复杂。最初,V8(JavaScript引擎节点js构建于此)在内部使用标记指针

诀窍在于,64位机器上的指针以这样一种方式对齐,即至少三个有效位为0。因此,您可以在指针本身中存储附加信息(例如,它是指针还是整数)

所以V8将整数和指针存储在堆栈上,在相同的64位空间中。请注意,由于最后一位用作标志,因此V8中的整数最多为61位(而AFAIK仅为32位?)。另一方面,double作为单独的对象存储在堆上

另一方面,WebKit实现现在使用所谓的nan-boxing,它将指针存储在double中。这源于观察到NaN具有不同的表示形式。您可能会问,如何在53位中存储64位指针(实际上是61位指针)?你可以,因为目前(也就是说,由于ram的大小很小),只使用了48位

因此,在WebKit中,整数确实存储为双精度。但是WebKit也在堆栈上存储了小整数(作为适当的整数类型),以便在循环和索引中使用它们。这是因为整数运算至少和浮点运算一样快