From 168ca8727e3eb1927743578be07e949bf7a475dd Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Thu, 6 Feb 2020 13:39:34 +0100 Subject: [PATCH] Fix division by zero on 32bit systems. --- src/xbt/random.cpp | 7 +++++-- src/xbt/random_test.cpp | 6 +++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/xbt/random.cpp b/src/xbt/random.cpp index 22d7591650..04aa0fc04e 100644 --- a/src/xbt/random.cpp +++ b/src/xbt/random.cpp @@ -55,8 +55,11 @@ double uniform_real(double min, double max) } // This reuses Boost's uniform real distribution ideas - constexpr unsigned long divisor = decltype(mt19937_gen)::max() - decltype(mt19937_gen)::min() + 1; - unsigned long numerator = mt19937_gen() - decltype(mt19937_gen)::min(); + constexpr unsigned long divisor = decltype(mt19937_gen)::max() - decltype(mt19937_gen)::min(); + unsigned long numerator; + do { + numerator = mt19937_gen() - decltype(mt19937_gen)::min(); + } while (numerator == divisor); return min + (max - min) * numerator / divisor; } diff --git a/src/xbt/random_test.cpp b/src/xbt/random_test.cpp index 60c52a4531..a35d5804ca 100644 --- a/src/xbt/random_test.cpp +++ b/src/xbt/random_test.cpp @@ -16,10 +16,10 @@ TEST_CASE("xbt::random: Random Number Generation") SECTION("Using XBT_RNG_xbt") { simgrid::xbt::random::set_mersenne_seed(12345); - REQUIRE_THAT(simgrid::xbt::random::exponential(25), EpsilonApprox(0.00291934352469749815)); + REQUIRE_THAT(simgrid::xbt::random::exponential(25), EpsilonApprox(0.00291934351538427348)); REQUIRE(simgrid::xbt::random::uniform_int(1, 6) == 4); - REQUIRE_THAT(simgrid::xbt::random::uniform_real(0, 1), EpsilonApprox(0.31637556036002933979)); - REQUIRE_THAT(simgrid::xbt::random::normal(0, 2), EpsilonApprox(1.62746784853777226587)); + REQUIRE_THAT(simgrid::xbt::random::uniform_real(0, 1), EpsilonApprox(0.31637556043369124970)); + REQUIRE_THAT(simgrid::xbt::random::normal(0, 2), EpsilonApprox(1.62746784745133976635)); } SECTION("Using XBT_RNG_std") -- 2.20.1