Javascript 原生支持 64 位浮点数

Native support for 64 bit floating point in Javascript

如问题 所述,即使是最新的 Ecmascript 8 也不支持 64 位整数。

但是 bigInt 的 stage 3 proposal 看起来很有前途,我希望它很快就会被添加到 Js 规范中。

但是,即使根据提议,我们也必须使用特殊的构造函数来声明大数。 (Q1)无法以一般方式表示大数字的背后的技术原因是什么?

let bigNum = 2 ** 64 // Why can't JS do this without losing precision? (at least in future)

我知道 JavaScript 表示所有使用 IEEE-754 双精度(64 位)浮点数的数字,这会导致问题。

(Q2) 为什么 Javascript 不能使用 其他不丢失精度的标准 表示所有数字?

(Q3)如果Javascript真的这么做了会出现什么并发症?

编辑:正如T.J所述,我们可以使用后缀代替构造函数,但我仍然觉得那不完全是一般符号

(Q1) What is the technical reason behind, being unable to represent big numbers in the general way?

破坏网络。 JavaScript 数字的基本原理现在无法更改,在最初定义它们 20 多年后。还有性能问题:JavaScript 的当前数字(IEEE-754 二进制双精度 [64 位] 精度)是 非常快 浮点数,这要归功于内置在 CPU 中和数学协处理器。这种速度的代价是精度;任意精度(或更大的精确范围)的成本是性能。

将来的某一天,也许 JavaScript 会得到 IEEE-754 64 位甚至 128 位 十进制 浮点数(参见 here and here ),如果这些格式(2008 年推出)扩散到生态系统中并获得硬件支持。但这是我的猜测。 :-)

(Q2) Why can't Javascript represent all numbers using some other standard which doesn't lose precision?

参见问题 1。 :-)

(Q3) What complications would arise if Javascript actually did that?

参见问题 1。 :-)

Even according to the proposal, we have to use a special constructor for declaring big numbers.

如果你特别想要 64 位。如果您只想要 BigInts,该提案包括一个新符号,即 n 后缀,为此:2n 是一个 BigInt 2。因此对于 BigInts,您的示例将是

let bigNum = 2n ** 64n;