【问题标题】:Native support for 64 bit floating point in JavascriptJavascript 中对 64 位浮点的本机支持
【发布时间】:2017-12-18 12:28:17
【问题描述】:

正如问题here 所述,即使是最新的 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 所说,我们可以使用后缀代替构造函数,但我仍然觉得这不完全是 一般表示法

【问题讨论】:

    标签: javascript 64-bit ecmascript-next


    【解决方案1】:

    (Q1) 无法以一般方式表示大数字背后的技术原因是什么?

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

    在未来的某一天,如果这些格式(引入2008 年)扩散到生态系统并获得硬件支持。但这是我的猜测。 :-)

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

    见第一季度。 :-)

    (Q3)如果 Javascript 真的这样做会出现什么问题?

    见第一季度。 :-)

    即使按照提议,我们也必须使用特殊的构造函数来声明大数。

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

    let bigNum = 2n ** 64n;
    

    【讨论】:

    • 感谢您的快速回答。如果 JS 做到了,即使没有 n 后缀,您能否详细说明它将如何破坏网络
    • @PubuduDodangoda:当前代码期望 IEEE-754 64 位二进制双精度行为与 JavaScript 数字。因此 JavaScript 数字必须保持 IEEE-754 64 位二进制双精度。因此需要一些不同的
    • 我会接受你的回答。但我仍然不明白其中的风险。 更高的精度将如何破坏网络?
    • @PubuduDodangoda:再说一遍:通过改变代码所期望的数字语义。另外,与内置于 CPU 中的 IEEE-754 double 相比,BigInt 的性能成本也很高。
    猜你喜欢
    • 2011-05-03
    • 1970-01-01
    • 2012-03-27
    • 2011-01-23
    • 2015-05-26
    • 2015-03-21
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    相关资源
    最近更新 更多