diff options
author | Louis Dionne <ldionne@apple.com> | 2019-08-22 19:35:46 +0000 |
---|---|---|
committer | Louis Dionne <ldionne@apple.com> | 2019-08-22 19:35:46 +0000 |
commit | b43923da5bb5390653b40143c2ef72ae90a9c1b7 (patch) | |
tree | 16bf6cdafeadf8d375c16ca6606f031058843294 /libcxx/test/std/numerics/rand/rand.util | |
parent | df5c04e1cdf3ab9873634e90784fc2617e8f6998 (diff) | |
download | bcm5719-llvm-b43923da5bb5390653b40143c2ef72ae90a9c1b7.tar.gz bcm5719-llvm-b43923da5bb5390653b40143c2ef72ae90a9c1b7.zip |
[libc++] Fix broken <random> test
In r369429, I hoisted a floating point computation to a variable in order
to remove a warning. However, it turns out this doesn't play well with
floating point arithmetic. This commit reverts r369429 and instead casts
the result of the floating point computation to remove the warning.
Whether hoisting the computaiton to a variable should give the same
result can be investigated independently.
llvm-svn: 369693
Diffstat (limited to 'libcxx/test/std/numerics/rand/rand.util')
-rw-r--r-- | libcxx/test/std/numerics/rand/rand.util/rand.util.canonical/generate_canonical.pass.cpp | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/libcxx/test/std/numerics/rand/rand.util/rand.util.canonical/generate_canonical.pass.cpp b/libcxx/test/std/numerics/rand/rand.util/rand.util.canonical/generate_canonical.pass.cpp index b5050a57857..047eb5e277c 100644 --- a/libcxx/test/std/numerics/rand/rand.util/rand.util.canonical/generate_canonical.pass.cpp +++ b/libcxx/test/std/numerics/rand/rand.util/rand.util.canonical/generate_canonical.pass.cpp @@ -19,78 +19,85 @@ int main(int, char**) { - typedef std::minstd_rand0 E; - auto range = E::max() - E::min(); - { + typedef std::minstd_rand0 E; typedef float F; E r; F f = std::generate_canonical<F, 0>(r); - assert(f == truncate_fp((16807 - E::min()) / (range + F(1)))); + assert(f == truncate_fp((16807 - E::min()) / (static_cast<F>(E::max() - E::min()) + F(1)))); } { + typedef std::minstd_rand0 E; typedef float F; E r; F f = std::generate_canonical<F, 1>(r); - assert(f == truncate_fp((16807 - E::min()) / (range + F(1)))); + assert(f == truncate_fp((16807 - E::min()) / (static_cast<F>(E::max() - E::min()) + F(1)))); } { + typedef std::minstd_rand0 E; typedef float F; E r; F f = std::generate_canonical<F, std::numeric_limits<F>::digits - 1>(r); - assert(f == truncate_fp((16807 - E::min()) / (range + F(1)))); + assert(f == truncate_fp((16807 - E::min()) / (static_cast<F>(E::max() - E::min()) + F(1)))); } { + typedef std::minstd_rand0 E; typedef float F; E r; F f = std::generate_canonical<F, std::numeric_limits<F>::digits>(r); - assert(f == truncate_fp((16807 - E::min()) / (range + F(1)))); + assert(f == truncate_fp((16807 - E::min()) / (static_cast<F>(E::max() - E::min()) + F(1)))); } { + typedef std::minstd_rand0 E; typedef float F; E r; F f = std::generate_canonical<F, std::numeric_limits<F>::digits + 1>(r); - assert(f == truncate_fp((16807 - E::min()) / (range + F(1)))); + assert(f == truncate_fp((16807 - E::min()) / (static_cast<F>(E::max() - E::min()) + F(1)))); } { + typedef std::minstd_rand0 E; typedef double F; E r; F f = std::generate_canonical<F, 0>(r); - assert(f == truncate_fp((16807 - E::min()) / (range + F(1)))); + assert(f == truncate_fp((16807 - E::min()) / (static_cast<F>(E::max() - E::min()) + F(1)))); } { + typedef std::minstd_rand0 E; typedef double F; E r; F f = std::generate_canonical<F, 1>(r); - assert(f == truncate_fp((16807 - E::min()) / (range + F(1)))); + assert(f == truncate_fp((16807 - E::min()) / (static_cast<F>(E::max() - E::min()) + F(1)))); } { + typedef std::minstd_rand0 E; typedef double F; E r; F f = std::generate_canonical<F, std::numeric_limits<F>::digits - 1>(r); assert(f == truncate_fp( (16807 - E::min() + - (282475249 - E::min()) * (range + F(1))) / - ((range + F(1)) * (range + F(1))))); + (282475249 - E::min()) * (static_cast<F>(E::max() - E::min()) + F(1))) / + ((static_cast<F>(E::max() - E::min()) + F(1)) * (static_cast<F>(E::max() - E::min()) + F(1))))); } { + typedef std::minstd_rand0 E; typedef double F; E r; F f = std::generate_canonical<F, std::numeric_limits<F>::digits>(r); assert(f == truncate_fp( (16807 - E::min() + - (282475249 - E::min()) * (range + F(1))) / - ((range + F(1)) * (range + F(1))))); + (282475249 - E::min()) * (static_cast<F>(E::max() - E::min()) + F(1))) / + ((static_cast<F>(E::max() - E::min()) + F(1)) * (static_cast<F>(E::max() - E::min()) + F(1))))); } { + typedef std::minstd_rand0 E; typedef double F; E r; F f = std::generate_canonical<F, std::numeric_limits<F>::digits + 1>(r); assert(f == truncate_fp( (16807 - E::min() + - (282475249 - E::min()) * (range + F(1))) / - ((range + F(1)) * (range + F(1))))); + (282475249 - E::min()) * (static_cast<F>(E::max() - E::min()) + F(1))) / + ((static_cast<F>(E::max() - E::min()) + F(1)) * (static_cast<F>(E::max() - E::min()) + F(1))))); } return 0; |