commit | 6c2427457b0c5ebaefa5c1a6003117ca8126e7bc | [log] [tgz] |
---|---|---|
author | Bruce Dawson <brucedawson@chromium.org> | Fri Dec 08 21:58:50 2017 |
committer | Commit Bot <commit-bot@chromium.org> | Fri Dec 08 21:58:50 2017 |
tree | 956499100f39bd0fc734e7bb47b2b4eae660e60d | |
parent | 8cabcdc2844ff77a54a0bfcb172c2a96c5ae686f [diff] |
Fix epsilon calculation for large-double comparisons My whole life has been leading up to this bug fix. TimeTicks.FromQPCValue was failing on some machines and this turned out to be caused by a bad epsilon value when comparing two floating-point numbers. I have written some of the reference pages about the perils of floating-point comparisons so this bug really spoke to me: https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ The problem is that when testing with a QPC value of int64_t max and a QPC frequency of 2.149252 MHz the result is around 4.29e18, and at that magnitude the precision of a double is 512.0. The test was using an epsilon of 1.0 for its EXPECT_NEAR comparison and this epsilon is meaningless for numbers of that magnitude - either the doubles will be identical or they will differ by a multiple of 512.0. The real-life implications of this bug are that if you run Chrome on a machine with an uptime of 136 millennia then if you store TimeTicks::FromQPCValue in a double you should expect less than half a millisecond of precision. I guess I should update this article to warn about the risks of using double: https://randomascii.wordpress.com/2012/02/13/dont-store-that-in-a-float/ The fix is to calculate the actual minimum epsilon at the magnitude of the numbers and use the maximum of that and 1.0 as the epsilon parameter to EXPECT_NEAR. I have a tentative fix to DoubleNearPredFormat so that EXPECT_NEAR will fail if passed an epsilon value that is meaninglessly small - this change would have detected the bad test: https://github.com/google/googletest/issues/1350 Bug: 786046 Change-Id: I92ee56309a0cab754dee97e11651ae12547a348e Reviewed-on: https://chromium-review.googlesource.com/816053 Commit-Queue: Bruce Dawson <brucedawson@chromium.org> Reviewed-by: Yuri Wiitala <miu@chromium.org> Cr-Commit-Position: refs/heads/master@{#522894}
Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.
The project's web site is https://www.chromium.org.
Documentation in the source is rooted in docs/README.md.
Learn how to Get Around the Chromium Source Code Directory Structure .