【问题标题】:Different results of Math.hypot() on Chrome and FirefoxChrome 和 Firefox 上 Math.hypot() 的不同结果
【发布时间】:2020-07-16 09:48:53
【问题描述】:

当我运行下面的简单计算时,Chrome 和 Firefox 上的结果略有不同。

铬:56.1124478168614

火狐:56.11244781686139

let x = -24.42;
let y = -50.519999999999925;
console.log(Math.hypot(x, y));

Math.hypot() 的规范中是否存在漏洞,或者是其中一个浏览器以错误的方式实现它?

编辑:在 Firefox 中,Math.hypot(x, y) 的结果与 Math.sqrt(x*x, y*y) 相同,在 Chrome 中,Math.hypot(x, y) 的结果略有不同。因此我怀疑 Firefox 的计算是正确的。

【问题讨论】:

  • 不是骗子,而是related。实际上结果是一样的,只是 Chrome 似乎将小数限制为 13 位。
  • @Teemu 我知道浮点精度,但您肯定会期望 2020 年不同浏览器上的 Javascript 数学得到相同的结果。
  • 为什么您会期望相同非平凡计算的两种不同实现产生相同的舍入误差? (不管是哪一年,或者是哪种语言的实现!)
  • specs 说:“Math.hypot 返回一个依赖于实现的近似值 ...”。
  • @jmrk 因为我希望清楚地指定舍入行为(并且它与 Javascript 的其他部分一起使用)。但正如 Teemu 指出的那样,在这种情况下,规范特别提到了一个依赖于实现的近似值,它解释了不同的行为。

标签: javascript google-chrome firefox v8 hypotenuse


【解决方案1】:

虽然Math.js在两个浏览器中是相同的代码,但不同的引擎有不同的算法来执行基本的算术。例如,计算平方根的方法有很多种,两个不同的引擎不可能共享完全相同的实现。
有努力标准化跨引擎的精度,但它们尚未成功。例如,请参阅this article
至于为什么 Chrome 中的 Math.hypot 会返回不同的值来在同一引擎中手动进行计算,Math.hypot 旨在作为一种有效的近似值 - 而不仅仅是将工作包装成单个函数的简洁方式。因此,根据实施情况,其结果可能与实际计算有所不同。您说得对,在这种情况下,Firefox 的实现在数值上更准确,正如您的简单测试所证明的那样。

【讨论】:

  • 谢谢,我假设 Javascript 的所有部分的精度都已经标准化了。
  • 哇,链接的文章很糟糕。带有大胆声明的点击诱饵标题,然后没有提供支持该声明的证据。标题问题的答案也很简单:如果 V8 被破坏(在数学或其他地方),请在 crbug.com/v8/new 提交错误。也就是说,不同舍入的浮点结果并不构成损坏。
  • 我同意这是一个诱饵标题,但如果你查看 Athan Reines,他实际上是相当合格的,他的项目绝对是我讨论的一个有趣的例子。
  • 当然,面试本身没问题;只是它变成了我要批评的文章的方式。
【解决方案2】:

在 Firefox 中,Math.hypot(x, y) 的结果与 Math.sqrt(x*x, y*y) 相同

这让我们对 Firefox 是如何实现 Math.hypot 做出相当自信的猜测 :-)

在 Chrome 中,Math.hypot(x, y) 的结果略有不同

这是 Chrome 的实现:

https://chromium.googlesource.com/v8/v8/+/master/src/builtins/math.tq#389

正如您从第 421 行的注释中看到的那样,Kahan 求和用于避免/最小化舍入误差——因此显然其意图是比简单的 sqrt(x*x + y*y) 实现更准确 . (我试图验证这是否真的是这种情况下的结果,但 Wolfram Alpha 只是四舍五入到56.1124,而且我不知道那里有另一个方便的无限精度浮点评估器,所以我不能肯定地说。)

正确计算

在存在有限的精度和舍入误差的情况下,很难定义“正确”的方式。例如,在某些情况下,(数学上等价的!)表达式(a * b) / ca * (b / c) 由于舍入而产生不同的结果,此外,a、b、c 的值决定了哪种计算结果的方式更接近到(无限精度)理论结果,所以每个实现都可能得到“幸运”或“不幸”。

【讨论】:

  • 您可以在keisan.casio.com/calculator实际结果与获得卡西欧Keisan高精度计算器几乎任意精度的是一样的东西56.112447816861388657114451996508313946336113356817432975754273642793555379412475351986222291941521992138354723 ... SPAN>
猜你喜欢
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 2015-09-15
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多