我正致力于提高对Node中浮点的理解。我的理解是, javascript中的每个数字都存储为64位浮点数(这有点疯狂,非常酷)我想玩这些一点点。
是否有一种简单的方法可以打印出内部存储任意数字的方式?像(5).toFloatRepresentation()那样会返回101...
?
我环顾四周,无法找到任何东西 - 如果我错过了一些明显的东西,我道歉!
我知道我可以写一个能做到这一点的功能,但我有兴趣从另一方面看待事情!
谢谢!
答案 0 :(得分:1)
以下是如何获取浮点数的可视化:
function getBinaryRepresentation(num) {
// Store as float
var buffer = new Float64Array([num]).buffer;
// Retrieve as unsigned bytes
var view = new Uint8Array(buffer);
// Convert bytes to string (binary representation)
return view.reduceRight(
(arr, n) => arr.concat(('0000000' + n.toString(2)).substr(-8)), []
).join('');
}
function formatFloatBits(num) {
var bits = getBinaryRepresentation(num);
// Put spaces between the different parts:
// - sign (1 bit)
// - exponent, with bias (11 bits)
// - significand (52 bits), without most significant 1
return bits[0] + ' ' + bits.slice(1, 12) + ' ' + bits.slice(12);
}
function print(num) {
console.log(formatFloatBits(num));
}
// Examples:
print(0);
print(2);
print(2.1);
print(7);
print(-7);

答案 1 :(得分:1)
我的理解是javascript中的每个数字都存储为64位浮点
排序,种类,不完全。数字的内部表示非常复杂。最初V8(构建的JavaScript引擎节点js)在内部使用了标记指针。
技巧是64位机器上的指针以至少三个有效位为0的方式对齐。因此,您可以在指针本身中存储其他信息(例如,它是指针还是整数)。
因此,V8在同一个64位空间中存储堆栈中的整数和指针。注意,由于最后一位用作标志,因此V8中的整数最多为61位(而AFAIK只有32位?)。另一方面,双打作为单独的对象存储在堆上。
另一方面,WebKit实现现在使用所谓的nan-boxing,它将指针存储在双精度内。这是因为观察到NaN具有0
个不同的表示。您可能会问如何在53位内存储64位指针(或实际的61位指针)?嗯,你可以,因为目前(即因为小的公羊尺寸)只使用48位。
因此在WebKit中,整数确实存储为双精度数。但是WebKit也有小整数存储在堆栈中(作为正确的整数类型),以便在循环和索引中使用它们。这是因为整数运算仍然至少与浮点运算一样快,在很多情况下更快。
这是一篇你可能想要阅读的有趣(虽然过时)文章:
https://wingolog.org/archives/2011/05/18/value-representation-in-javascript-implementations
是否有一种简单的方法可以打印出内部存储任意数字的方式?
没有。实际上根本就没有办法。正如我所提到的,完全取决于JavaScript引擎,并且规范中没有API来检索该信息。您可以尝试阅读the source code。
我知道我可以编写一个执行此操作的函数
你做不到。反正不是在JavaScript中。除非我真的误解了这个问题。内部表示和您在JavaScript中看到的是两个不同的世界。