Round a double multiplication before casting it to integer
authorBenjamin Barenblat <bbaren@google.com>
Thu, 14 Apr 2022 17:20:16 +0000 (18:20 +0100)
committerBenjamin Barenblat <bbaren@debian.org>
Thu, 14 Apr 2022 17:20:16 +0000 (18:20 +0100)
commit869bbdb88c8623db3494a7a4f0aecd09f0e7b001
tree434141c749001b9591bda2a1a6b6040e726fba52
parenta0c41abcbfb82dc32275f103ca697db8b3cf07e9
Round a double multiplication before casting it to integer

Forwarded: yes
Applied-Upstream: https://github.com/abseil/abseil-cpp/commit/60be12ed9822078970f05f3c560324184302df6b

The code

    static_cast<int>(x * y)

(for double x and y) performs a double multiplication into a temporary
that, by standard, may have excess precision. The subsequent cast to int
discards the excess precision. However, the cast may examine the excess
precision during conversion, producing surprising results like

    static_cast<int>(1.7 * 10) == 16

on certain systems. Correct this case by explicitly rounding 1.7 * 10
before casting it.

The author works at Google. Upstream applied this patch as Piper
revision 378922064 and exported it to GitHub; the Applied-Upstream URL
above points to the exported commit.

Gbp-Pq: Name missing-rint.diff
absl/random/mocking_bit_gen_test.cc