【发布时间】:2016-06-01 01:14:47
【问题描述】:
JavaScript 将数字表示为 IEEE 754 双精度数,这是确定性的。更不用说,我看到一些编译器优化可以改变浮点运算的顺序,在不同的运行中带来不确定性。所以,问题是:不使用其他非确定性来源(Math.random 等),Number -> Number JavaScript 函数是否总是会产生与平台和引擎无关的相同结果?
【问题讨论】:
-
“是的。” JavaScript 被指定为具有数字的 IEEE 754-Double 语义,并且它具有所有数学运算(从语言语义的角度来看)的明确定义的顺序,其中所有中间值必须精确地实现。如果存在不符合 ECMAScript 规范的平台/引擎。
-
@user2864740:规范大概不要求
Math.log、Math.sin、Math.cos等被正确舍入?任何使用这些的代码都可能无法跨平台给出相同的结果。 -
@MarkDickinson 您能否详细说明并在答案中说明您的观点?
-
@Viclib:恐怕我对 ECMAScript 的了解不够,无法给出权威的答案。但在该标准的最新版本(第 6 版)中,第 20.2.2 节中有一条注释以“函数 acos、acosh、asin、asinh、atan、atanh、atan2、cbrt、cos、cosh、 exp、expm1、hypot、log、log1p、log2、log10、pow、random、sin、sinh、sqrt、tan 和 tanh 在这里没有精确指定......"。这并不奇怪:对超越函数进行有效且有保证的正确舍入是一个难以解决的问题,而且要求它是不合理的。
标签: javascript ieee-754