Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix division by zero on 32bit systems.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Thu, 6 Feb 2020 12:39:34 +0000 (13:39 +0100)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Thu, 6 Feb 2020 12:41:09 +0000 (13:41 +0100)
src/xbt/random.cpp
src/xbt/random_test.cpp

index 22d7591..04aa0fc 100644 (file)
@@ -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;
 }
 
index 60c52a4..a35d580 100644 (file)
@@ -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")