// Copyright 2017 The Abseil Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef ABSL_RANDOM_INTERNAL_GENERATE_REAL_H_ #define ABSL_RANDOM_INTERNAL_GENERATE_REAL_H_ // This file contains some implementation details which are used by one or more // of the absl random number distributions. #include <cstdint> #include <cstring> #include <limits> #include <type_traits> #include "absl/meta/type_traits.h" #include "absl/numeric/bits.h" #include "absl/random/internal/fastmath.h" #include "absl/random/internal/traits.h" namespace absl { ABSL_NAMESPACE_BEGIN namespace random_internal { // Tristate tag types controlling the output of GenerateRealFromBits. struct GeneratePositiveTag { … }; struct GenerateNegativeTag { … }; struct GenerateSignedTag { … }; // GenerateRealFromBits generates a single real value from a single 64-bit // `bits` with template fields controlling the output. // // The `SignedTag` parameter controls whether positive, negative, // or either signed/unsigned may be returned. // When SignedTag == GeneratePositiveTag, range is U(0, 1) // When SignedTag == GenerateNegativeTag, range is U(-1, 0) // When SignedTag == GenerateSignedTag, range is U(-1, 1) // // When the `IncludeZero` parameter is true, the function may return 0 for some // inputs, otherwise it never returns 0. // // When a value in U(0,1) is required, use: // GenerateRealFromBits<double, PositiveValueT, true>; // // When a value in U(-1,1) is required, use: // GenerateRealFromBits<double, SignedValueT, false>; // // This generates more distinct values than the mathematical equivalent // `U(0, 1) * 2.0 - 1.0`. // // Scaling the result by powers of 2 (and avoiding a multiply) is also possible: // GenerateRealFromBits<double>(..., -1); => U(0, 0.5) // GenerateRealFromBits<double>(..., 1); => U(0, 2) // template <typename RealType, // Real type, either float or double. typename SignedTag = GeneratePositiveTag, // Whether a positive, // negative, or signed // value is generated. bool IncludeZero = true> inline RealType GenerateRealFromBits(uint64_t bits, int exp_bias = 0) { … } } // namespace random_internal ABSL_NAMESPACE_END } // namespace absl #endif // ABSL_RANDOM_INTERNAL_GENERATE_REAL_H_