无法重现 Chrome performance.now() 精度错误

Unable to reproduce Chrome performance.now() precision errors

提问人:BayanR 提问时间:4/25/2023 最后编辑:BayanR 更新时间:4/25/2023 访问量:118

问:

在 Chromium 浏览器中运行 performance.now() 时。您将面临以下现象,如下面的示例 performance.now() 输出所示。

147.5
150.09999990463257
151.19999980926514
152.09999990463257
156.59999990463257
164.89999985694885
168.89999985694885
172.89999985694885
176.89999985694885
180.29999995231628
185
188.89999985694885
192.59999990463257
196.39999985694885
201.09999990463257
209
212.5
217.09999990463257
220.79999995231628

我知道舍入错误是由于浮点精度而发生的,但是我无法在 c++ 或 javascript 中重现舍入错误。我可以创建的舍入错误看起来与 Chromium 的完全不同。

我已经测试了以下 c++ 代码,但舍入错误不同。

int main() {
    float sum = 100.0;
    for (int i = 0; i < 1000; i++) {
        sum += 0.1;
        std::cout << std::fixed << std::setprecision(17);

        std::cout << "Actual sum: " << sum << std::endl;
    }
    return 0;
}

具体是什么导致了这种现象,我们如何使用代码重现 chromium performance.now() 舍入精度错误?

C++ google-chrome 浮点双 精度

评论

2赞 Paul Sanders 4/25/2023
嗯,实际上有什么作用?performance.now()
0赞 PaulMcKenzie 4/25/2023
但是,我无法重现 c++ 或 javascript 中的舍入错误——祝你在这个 yeoman 的工作中好运。我认为没有办法在每个数字上都重复这一点,直到最低有效数字。
2赞 Alan Birtles 4/25/2023
据推测,它是略微随机的,以防止对其他进程的定时攻击
3赞 Alan Birtles 4/25/2023
是的,看看 developer.mozilla.org/en-US/docs/Web/API/Performance/......
1赞 Dennis Kats 4/25/2023
如果你真的对 Chromium 的实现方式感兴趣,你可以从这里开始探索源代码并跟踪函数调用。还要记住,虽然该函数以毫秒为单位返回一个值,但浏览器实际上以微秒为单位测量性能。因此,即使观察到的行为只是由于精度舍入误差造成的,do 也不能完全模拟值的范围。performance.now()+= 0.1

答: 暂无答案