Math.pow是否会在所有Node.js平台上给出相同的结果?

时间:2018-12-14 15:23:17

标签: javascript node.js

Math.pow将在所有Node.js平台上返回相同的结果(对于相同的输入)吗?

我猜因为that's defined by the IEEE 754,JavaScript算术结果始终是相同的(即确定性的,尽管不精确)。

相反,我猜想Math函数的结果不一定,特别是例如pow(理论上),在实施中,不同的平台可能会有不同的成本/准确性折衷。

如果我仅将问题限制为“所有Math.pow结果在Node.js上”怎么办?例如Math库在所有Node.js平台实现中是否足够相似?

1 个答案:

答案 0 :(得分:1)

因此,我将大致讨论浮点运算。由于Pow只是一个子集,因此也适用于它。

不幸的是,跨平台浮点运算很麻烦。在实现相同的假设下,它不是确定性的甚至。问题之一是,虽然浮点算术是标准化的,但从/到浮点的转换却没有(并且这发生在NodeJS的最低级别,我不认为它是NodeJS的一部分实现,因为它来自标准的C库)。

此处提供了有用的文章:https://gafferongames.com/post/floating_point_determinism/

  

如果您使用由同一编译器构建的可执行文件,在具有相同体系结构的计算机上运行并执行某些特定于平台的技巧,则可以在多台计算机上获得浮动计算的确定性结果。

     

用C或C ++编写任意浮点代码,并期望在不同的编译器或体系结构上提供完全相同的结果,甚至在调试和发行版之间提供相同的结果,这真是天真。

在您的情况下,文本所引用的应用程序是NodeJS二进制文件本身。请注意,相同版本的NodeJS弱于相同的二进制文件。这还不够。

因此,如果您在同一台计算机上使用相同的二进制文件,并且代码本身是确定性的(您怎么知道?NodeJS在后台做了很多工作),那么您的浮点算法很有可能像确定性一样好。但是你能保证吗?现在和将来?这不难吗?

另一种选择是使用一些十进制库(例如https://github.com/MikeMcl/decimal.js/)。请注意,它会牺牲性能来确保正确性。如果性能不是绝对关键的话,我建议您走这条路(不是应该的,毕竟您应该使用JS)。