[flang-commits] [flang] f3278e0 - [flang][runtime] Ensure that 0. <= RANDOM_NUMBER() < 1.

Peter Klausler via flang-commits flang-commits at lists.llvm.org
Fri Jun 3 22:44:30 PDT 2022


Author: Peter Klausler
Date: 2022-06-03T22:44:19-07:00
New Revision: f3278e0f3cfeb7cd1519b0b9154ccdc28f3410b5

URL: https://github.com/llvm/llvm-project/commit/f3278e0f3cfeb7cd1519b0b9154ccdc28f3410b5
DIFF: https://github.com/llvm/llvm-project/commit/f3278e0f3cfeb7cd1519b0b9154ccdc28f3410b5.diff

LOG: [flang][runtime] Ensure that 0. <= RANDOM_NUMBER() < 1.

It was possible for RANDOM_NUMBER() to return 1.0.

Differential Revision: https://reviews.llvm.org/D127020

Added: 
    

Modified: 
    flang/runtime/random.cpp

Removed: 
    


################################################################################
diff  --git a/flang/runtime/random.cpp b/flang/runtime/random.cpp
index 8f8145b299f4a..93461e436c6ae 100644
--- a/flang/runtime/random.cpp
+++ b/flang/runtime/random.cpp
@@ -54,17 +54,23 @@ inline void Generate(const Descriptor &harvest) {
   {
     CriticalSection critical{lock};
     for (std::size_t j{0}; j < elements; ++j) {
-      Int fraction{generator()};
-      if constexpr (words > 1) {
-        for (std::size_t k{1}; k < words; ++k) {
-          static constexpr auto rangeMask{(GeneratedWord{1} << rangeBits) - 1};
-          GeneratedWord word{(generator() - generator.min()) & rangeMask};
-          fraction = (fraction << rangeBits) | word;
+      while (true) {
+        Int fraction{generator()};
+        if constexpr (words > 1) {
+          for (std::size_t k{1}; k < words; ++k) {
+            static constexpr auto rangeMask{
+                (GeneratedWord{1} << rangeBits) - 1};
+            GeneratedWord word{(generator() - generator.min()) & rangeMask};
+            fraction = (fraction << rangeBits) | word;
+          }
+        }
+        fraction >>= words * rangeBits - PREC;
+        REAL next{std::ldexp(static_cast<REAL>(fraction), -(PREC + 1))};
+        if (next >= 0.0 && next < 1.0) {
+          *harvest.Element<REAL>(at) = next;
+          break;
         }
       }
-      fraction >>= words * rangeBits - PREC;
-      *harvest.Element<REAL>(at) =
-          std::ldexp(static_cast<REAL>(fraction), -(PREC + 1));
       harvest.IncrementSubscripts(at);
     }
   }


        


More information about the flang-commits mailing list