From ab52b3b9670a5bb555c148d9d5638a1a7fa3e877 Mon Sep 17 00:00:00 2001 From: Benjamin Barenblat Date: Tue, 29 Jun 2021 22:15:35 -0400 Subject: Add patch to explicitly round float multiplication Add a call to rint in a test, ensuring it passes on the x87. --- debian/patches/missing-rint.diff | 45 ++++++++++++++++++++++++++++++++++++++++ debian/patches/series | 1 + 2 files changed, 46 insertions(+) create mode 100644 debian/patches/missing-rint.diff diff --git a/debian/patches/missing-rint.diff b/debian/patches/missing-rint.diff new file mode 100644 index 00000000..d9865364 --- /dev/null +++ b/debian/patches/missing-rint.diff @@ -0,0 +1,45 @@ +From: Benjamin Barenblat +Subject: 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(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(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. + +--- a/absl/random/mocking_bit_gen_test.cc ++++ b/absl/random/mocking_bit_gen_test.cc +@@ -15,6 +15,7 @@ + // + #include "absl/random/mocking_bit_gen.h" + ++#include + #include + #include + +@@ -328,8 +329,9 @@ TEST(BasicMocking, WillByDefaultWithArgs) { + + absl::MockingBitGen gen; + ON_CALL(absl::MockPoisson(), Call(gen, _)) +- .WillByDefault( +- [](double lambda) { return static_cast(lambda * 10); }); ++ .WillByDefault([](double lambda) { ++ return static_cast(std::rint(lambda * 10)); ++ }); + EXPECT_EQ(absl::Poisson(gen, 1.7), 17); + EXPECT_EQ(absl::Poisson(gen, 0.03), 0); + } diff --git a/debian/patches/series b/debian/patches/series index 99f5ccbc..9cca595d 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -6,3 +6,4 @@ thumb-function-bounds.diff float-rounding.diff DiscreteDistributionTest-irrelevant-destination-buckets.diff float-tests-disable-i386.diff +missing-rint.diff -- cgit v1.2.3