浏览器是否在规范内JavaScript Math函数(atan2)的最后一位数字不同?

Ric*_*aca 28 javascript specifications atan2 language-lawyer

我在的输出的最后一位看到Firefox和Safari之间的差异Math#atan2

我的代码:

Math.atan2(-0.49999999999999994, 0.8660254037844387)
Run Code Online (Sandbox Code Playgroud)

Safari(12.1.1)提供,-0.5235987755982988但Firefox(Mac / 67.0)提供-0.5235987755982987

这当然是微小的差异。但是,似乎所有实现都应该在所有输入上产生相同的输出。例如,这样的差异可能导致if语句根据浏览器遵循不同的路径。

我看到的内容是否违反任何版本的ECMAScript规范?

Mar*_*yer 32

ECMAScript 2015规格说明如下:

函数acos,acosh,asin,asinh,atan,atanh,atan2,cbrt,cos,cosh,exp,expm1,hypot,log,log1p,log2,log10,pow,pow,random,sin,sinh,sqrt,tan的行为和tanh在这里没有明确指定,只是要求某些表示感兴趣边界情况的参数值需要特定结果。对于其他参数值,这些函数用于计算对熟悉的数学函数的结果的近似值,但是在选择近似算法时允许一定的自由度。通常的目的是,实现者应该能够对ECMAScript使用相同的数学库。在给定的硬件平台上可供该平台上的C程序员使用。

尽管算法的选择留给实现,但建议(但未由该标准指定)实现使用fdlibm中包含的IEEE 754-2008算法的近似算法,fdlibm是Sun Microsystems(http:/ /www.netlib.org/fdlibm)。

5.1规范具有类似的语言。

因此,我认为可以肯定地说这种行为没有违反规范。

  • IEEE754规定5个运算符必须精确:+-/ *和`sqrt`。根据IEEE754,“ atan2”可能不精确。因此,即使实现遵循平台的C实现,又遵循IEEE754,您仍然不会获得跨平台按位相同的结果。 (4认同)

Tim*_*Tim 9

跨任何语言或平台的不同CPU / FPU和不同数学库上都会出现类似的浮点差异。如果您依赖完全正确的精度水平,那么您将会遇到麻烦。您应该始终将浮点值视为“模糊”。

ECMA规范未指定精度:

Math.atan2()函数针对Math.atan2(y,x)返回正x轴和射线从(0,0)到点(x,y)之间的平面角度(以弧度为单位) 。