60d9f25487
The transition algorithm for std::shuffle_order_engine uses long double to ensure that the value (max() - min() + 1) can be accurately represented, to avoid bias in the shuffling. However, when the base engine's range is small enough we can avoid slower long double arithmetic by using double. For example, long double is unnecessary for any base engine returning 32-bit values. This makes std::knuth_b::operator() about 15% faster on x86_64, and probably even more on targets where long double uses soft-float. libstdc++-v3/ChangeLog: * include/bits/random.h (independent_bit_engine): Fix typo in comment. (shuffle_order_engine): Fix incorrect description in comment. * include/bits/random.tcc (__representable_as_double (__p1_representable_as_double): New helper functions. (shuffle_order_engine::operator()): Use double for calculation if (max() - min() + 1) is representable as double. * testsuite/26_numerics/random/pr60037-neg.cc: Adjust dg-error line number. |
||
---|---|---|
.. | ||
accumulate | ||
adjacent_difference | ||
bit | ||
complex | ||
endian | ||
exclusive_scan | ||
gcd | ||
headers | ||
inclusive_scan | ||
inner_product | ||
iota | ||
lcm | ||
midpoint | ||
numbers | ||
partial_sum | ||
pstl/numeric_ops | ||
random | ||
reduce | ||
slice | ||
slice_array | ||
transform_exclusive_scan | ||
transform_inclusive_scan | ||
transform_reduce | ||
valarray | ||
lerp.cc |