1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 // <random>
10
11 // template<class RealType, size_t bits, class URNG>
12 // RealType generate_canonical(URNG& g);
13
14 #include <random>
15
16 #include <cassert>
17 #include <limits>
18
19 #include "test_macros.h"
20 #include "truncate_fp.h"
21
main(int,char **)22 int main(int, char**)
23 {
24 {
25 typedef std::minstd_rand0 E;
26 typedef float F;
27 E r;
28 F f = std::generate_canonical<F, 0>(r);
29 assert(f == truncate_fp((16807 - E::min()) / (static_cast<F>(E::max() - E::min()) + F(1))));
30 }
31 {
32 typedef std::minstd_rand0 E;
33 typedef float F;
34 E r;
35 F f = std::generate_canonical<F, 1>(r);
36 assert(f == truncate_fp((16807 - E::min()) / (static_cast<F>(E::max() - E::min()) + F(1))));
37 }
38 {
39 typedef std::minstd_rand0 E;
40 typedef float F;
41 E r;
42 F f = std::generate_canonical<F, std::numeric_limits<F>::digits - 1>(r);
43 assert(f == truncate_fp((16807 - E::min()) / (static_cast<F>(E::max() - E::min()) + F(1))));
44 }
45 {
46 typedef std::minstd_rand0 E;
47 typedef float F;
48 E r;
49 F f = std::generate_canonical<F, std::numeric_limits<F>::digits>(r);
50 assert(f == truncate_fp((16807 - E::min()) / (static_cast<F>(E::max() - E::min()) + F(1))));
51 }
52 {
53 typedef std::minstd_rand0 E;
54 typedef float F;
55 E r;
56 F f = std::generate_canonical<F, std::numeric_limits<F>::digits + 1>(r);
57 assert(f == truncate_fp((16807 - E::min()) / (static_cast<F>(E::max() - E::min()) + F(1))));
58 }
59
60 {
61 typedef std::minstd_rand0 E;
62 typedef double F;
63 E r;
64 F f = std::generate_canonical<F, 0>(r);
65 assert(f == truncate_fp((16807 - E::min()) / (static_cast<F>(E::max() - E::min()) + F(1))));
66 }
67 {
68 typedef std::minstd_rand0 E;
69 typedef double F;
70 E r;
71 F f = std::generate_canonical<F, 1>(r);
72 assert(f == truncate_fp((16807 - E::min()) / (static_cast<F>(E::max() - E::min()) + F(1))));
73 }
74 {
75 typedef std::minstd_rand0 E;
76 typedef double F;
77 E r;
78 F f = std::generate_canonical<F, std::numeric_limits<F>::digits - 1>(r);
79 assert(f == truncate_fp(
80 (16807 - E::min() +
81 (282475249 - E::min()) * (static_cast<F>(E::max() - E::min()) + F(1))) /
82 ((static_cast<F>(E::max() - E::min()) + F(1)) * (static_cast<F>(E::max() - E::min()) + F(1)))));
83 }
84 {
85 typedef std::minstd_rand0 E;
86 typedef double F;
87 E r;
88 F f = std::generate_canonical<F, std::numeric_limits<F>::digits>(r);
89 assert(f == truncate_fp(
90 (16807 - E::min() +
91 (282475249 - E::min()) * (static_cast<F>(E::max() - E::min()) + F(1))) /
92 ((static_cast<F>(E::max() - E::min()) + F(1)) * (static_cast<F>(E::max() - E::min()) + F(1)))));
93 }
94 {
95 typedef std::minstd_rand0 E;
96 typedef double F;
97 E r;
98 F f = std::generate_canonical<F, std::numeric_limits<F>::digits + 1>(r);
99 assert(f == truncate_fp(
100 (16807 - E::min() +
101 (282475249 - E::min()) * (static_cast<F>(E::max() - E::min()) + F(1))) /
102 ((static_cast<F>(E::max() - E::min()) + F(1)) * (static_cast<F>(E::max() - E::min()) + F(1)))));
103 }
104
105 return 0;
106 }
107