gpt4 book ai didi

javascript - 跨不同浏览器的 JavaScript 中 Math.pow() 的奇怪结果

转载 作者:行者123 更新时间:2023-11-29 20:39:30 25 4
gpt4 key购买 nike

也许这只发生在 chrome 最新版本中。

仅在 Chrome 浏览器 中的负指数 值有一些奇怪的行为。

我已经检查过不同的浏览器并发现它真的很奇怪。由于 FireFoxChromium 将显示完全相同的结果,而 Chrome 最新版本 将显示一些示例的不同结果。我不知道发生了什么?

这是我对不同浏览器的发现...

火狐

enter image description here

Chrome

enter image description here

Chrome

enter image description here

怪事!!

对于 Math.pow(10,-4)Math.pow(10,-5),答案应该是 0.00010.00001 但为什么 chrome 的最新版本分别显示 0.000099999999999999990.000009999999999999999!!

有人可以解释为什么 chrome 会这样吗?

仅供引用 - 图片中已提及的所有浏览器版本。

最佳答案

Returns an implementation-dependent approximation of the result of raising base to the power exponent.

https://tc39.github.io/ecma262/#sec-applying-the-exp-operator

0.0001 是高于 0.00009999999999999999 的下一个可表示数字。 (结果相差一个最小精度单位。)

这似乎在 74.0.3700.0 ( changelog ) 中发生了变化,对应于 V8 roll。到 7.4.113,包括这个提交:

https://chromium.googlesource.com/v8/v8/+/98453126c109016c9d32c6ebd89dd83f69dd8efb

[builtins] [turbofan] Refactor Float64Pow to use single implementation

Remove platform-specific Float64Pow implementations and utils Pow infavor of a base::ieee754::pow implementation.

This unifies the implementation of pow for the compiler, wasm, andruntime.

因此他们将 Pow 的实现换成了其他东西。

为了证明我们得到了一个不同的数字并且它与 float 到十进制的转换无关:

> 10**-4 == 1e-4

或者,如果您不相信并想在较低级别探索 float ,请将数字转储为十六进制:

(需要 Firefox 67。)

from_bits = b => new Float64Array(new BigUint64Array([b]).buffer)[0]
to_bits = f => new BigUint64Array(new Float64Array([f]).buffer)[0]

console.log(to_bits(Math.pow(10,-4)).toString(16))

我在 Firefox 中得到 3f1a36e2eb1c432d,在 Chrome 中得到 3f1a36e2eb1c432c。

关于javascript - 跨不同浏览器的 JavaScript 中 Math.pow() 的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55958535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com