Number.EPSILON 的浏览器支持?

Fid*_*l90 3 javascript cross-browser epsilon browser-support

我想Number.EPSILON在我的应用程序中使用该值,并且想知道不同浏览器如何支持它。MDN 表示Firefox 和 Chrome 支持它,但 IE 和 Safari 不支持。

我自己在IE11和Edge的控制台测试过。Edge 给了我2.220446049250313e-16预期的结果,IE11 给了undefined. 我无法自己测试 Safari。

  1. 是否有支持表显示不同浏览器版本的支持?

  2. 我可以安全地var eps = Number.EPSILON || 2.220446049250313e-16;用作后备吗?

Tyl*_*Y86 5

1)您可以在浏览器中自己尝试并输入"https://jsfiddle.net/jz350gf1/1/"(不带引号)。如果您看到红色,则表示不受支持。

JavaScript 代码是document.body.bgColor = Number.EPSILON !== undefined ? 'lime' : 'red';.

例如,Vista 上的 IE9 和 Safari 5.1 不支持它。

在 MDN 页面底部还有Number.EPSILON的兼容性表。目前,它声称只有 Chrome、Firefox 和(也许)Opera 支持它。大于 5.1 的 Safari 版本可能支持它。我没有 Mac 来测试它。

在 caniuse.com,这里是 ES6 引入的特性。看起来最近版本的 Safari 完全支持。我不确定它可以追溯到多远。从那时到现在的版本是 Safari 的黑暗时代。Opera 可能不支持吧?不,它确实支持它。

无论哪种方式,至于 2) 是的。常量就是常量。双精度浮点的 epsilon 在所有语言中总是相同的。尽管您想具体地推导出该值,但根据此 wiki 页面,您应该能够通过计算推导出它。这是一个演示。

function getEpsilon() {
  var e = 1.0;
  while ( ( 1.0 + 0.5 * e ) !== 1.0 )
    e *= 0.5;
  return e;
}

alert("And the epsilon is... "+getEpsilon());
Run Code Online (Sandbox Code Playgroud)

因此,var eps = Number.EPSILON || getEpsilon();如果您想对可能使用少于双精度浮点数类型的不符合标准的浏览器保持高度警惕,您可以这样做,尽管我相信不存在(我对例外持开放态度)。:)

  • 如果您更喜欢技术上更准确的 epsilon 替代计算(但实际上没有用),则计算值再次减半(`1.1102230246251565e-16`)。不过,要在与给定值进行比较时使用它,您需要将其加倍(因为舍入误差是 1 位,而不是 1/2 位),并且在此过程中使其毫无意义。这就解释了维基页面上的两栏。(`b^{-(p-1)}/2` 与 `b^{-(p-1)}`) (2认同)