JavaScript代表数字为IEEE 754双倍,这是确定性的。更少,我已经看到一些参数,一些编译器优化可以改变浮点运算的顺序,在不同的运行中带来非确定性。所以,问题是:不使用其他非确定性来源(Math.random
等),Number -> Number
JavaScript函数是否总能产生与平台和引擎无关的相同结果?
答案 0 :(得分:3)
某些编译器优化可以改变浮点运算的顺序,在不同的运行中带来非确定性
ECMAScript规范没有讨论这种优化。但一般情况下,预期(就像某些TypedArray
算法明确指出的那样)“优化不得在算法的指定行为中引入任何可观察到的变化。”和运算符的评估顺序在ECMAScript中有严格的规定。
因此,除非执行此类内容(并且其标准合规性尚需确定)的实施证明是错误的,否则我们可以假设答案是是。
答案 1 :(得分:1)
猜测你指的是语言特定的非确定性,而不是IEEE-754特有的。
许多其他语言,例如C
具有undefined
或implementation-specific
行为,允许编译器为该处理器发出非常严格的代码,但代价是大量的陷阱
例如,用C
语言表达式:
(a++) + (++a)
可以用两种不同的顺序进行评估,你可以得到两个有效答案。
但是,EcmaScript 3(和5)指定了表达式的操作顺序,因此任何JavaScript平台都应该以完全相同的方式执行操作。
这里有一个较长的讨论: