JavaScript 数字是确定性的吗?



JavaScript 将数字表示为 IEEE 754 双精度,这是确定性的。下界不那么,我已经看到一些编译器优化可以改变浮点运算的顺序,在不同运行中带来非确定性的论点。所以,问题是:不使用其他非确定性来源(Math.random等),一个Number -> Number的JavaScript函数总是独立于平台和引擎产生相同的结果吗?

一些编译器优化可以更改浮点运算的顺序,从而在不同运行中带来非确定性

ECMAScript 规范没有讨论这样的优化。然而,一般来说,"优化不得在算法的指定行为中引入任何可观察到的变化"是预期的(就像某些TypedArray算法明确指出的那样)。运算符的求值顺序在 ECMAScript 中是相当严格的。

因此,除非被执行此类操作的实现证明是错误的(并且其标准合规性仍需要确定),否则我们可以假设答案是肯定的。

猜测你指的是特定于语言的非确定性,而不是任何特定于IEEE-754的东西。

许多其他语言(例如C)具有undefinedimplementation-specific行为,允许编译器为该处理器发出非常紧凑的代码,但代价是大量陷阱。

例如,在C语言中,这个表达式:

(a++) + (++a)

可以按两种不同的顺序进行评估,您可以得到两个有效的答案。

但是,EcmaScript 3(和 5)指定了表达式的操作顺序,因此任何 JavaScript 平台都应该以完全相同的方式做事。

这里有一个更长的讨论:

运算符的 Javascript 求值顺序

最新更新