JavaScript数字是否确定?

时间:2016-06-01 01:14:48

标签: javascript ieee-754

JavaScript代表数字为IEEE 754双倍,这是确定性的。更少,我已经看到一些参数,一些编译器优化可以改变浮点运算的顺序,在不同的运行中带来非确定性。所以,问题是:不使用其他非确定性来源(Math.random等),Number -> Number JavaScript函数是否总能产生与平台和引擎无关的相同结果?

2 个答案:

答案 0 :(得分:3)

  

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

ECMAScript规范没有讨论这种优化。但一般情况下,预期(就像某些TypedArray算法明确指出的那样)“优化不得在算法的指定行为中引入任何可观察到的变化。”和运算符的评估顺序在ECMAScript中有严格的规定。

因此,除非执行此类内容(并且其标准合规性尚需确定)的实施证明是错误的,否则我们可以假设答案是

答案 1 :(得分:1)

猜测你指的是语言特定的非确定性,而不是IEEE-754特有的。

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

例如,用C语言表达式:

(a++) + (++a)

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

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

这里有一个较长的讨论:

Javascript evaluation order for operators