MCKL
Monte Carlo Kernel Library
u01.h
Go to the documentation of this file.
1 //============================================================================
2 // MCKL/include/mckl/randomc/u01.h
3 //----------------------------------------------------------------------------
4 // MCKL: Monte Carlo Kernel Library
5 //----------------------------------------------------------------------------
6 // Copyright (c) 2013-2018, Yan Zhou
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are met:
11 //
12 // Redistributions of source code must retain the above copyright notice,
13 // this list of conditions and the following disclaimer.
14 //
15 // Redistributions in binary form must reproduce the above copyright notice,
16 // this list of conditions and the following disclaimer in the documentation
17 // and/or other materials provided with the distribution.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS
20 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 // POSSIBILITY OF SUCH DAMAGE.
30 //============================================================================
31 
32 #ifndef MCKL_RANDOMC_U01_H
33 #define MCKL_RANDOMC_U01_H
34 
35 #include <mckl/internal/config.h>
36 
37 #ifndef UINT32_C
38 #error __STDC_CONSTANT_MACROS not defined before #include<stdint.h>
39 #endif
40 
41 #ifdef MCKL_OPENCL
42 #define MCKL_RANDOMC_U01_23F (1.0f / 8388608.0f)
43 #define MCKL_RANDOMC_U01_24F (1.0f / 16777216.0f)
44 #define MCKL_RANDOMC_U01_31F (1.0f / 2147483648.0f)
45 #define MCKL_RANDOMC_U01_32F (1.0f / 4294967296.0f)
46 #define MCKL_RANDOMC_U01_33F (1.0f / 8589934592.0f)
47 #define MCKL_RANDOMC_U01_64F (1.0f / 18446744073709551616.0f)
48 #define MCKL_RANDOMC_U01_65F (1.0f / 36893488147419103232.0f)
49 #if MCKL_HAS_OPENCL_DOUBLE
50 #define MCKL_RANDOMC_U01_32D (1.0 / 4294967296.0)
51 #define MCKL_RANDOMC_U01_33D (1.0 / 8589934592.0)
52 #define MCKL_RANDOMC_U01_52D (1.0 / 4503599627370496.0)
53 #define MCKL_RANDOMC_U01_53D (1.0 / 9007199254740992.0)
54 #define MCKL_RANDOMC_U01_63D (1.0 / 9223372036854775808.0)
55 #define MCKL_RANDOMC_U01_64D (1.0 / 18446744073709551616.0)
56 #define MCKL_RANDOMC_U01_65D (1.0 / 36893488147419103232.0)
57 #endif // MCKL_HAS_OPENCL_DOUBLE
58 #else // MCKL_OPENCL
59 static const float MCKL_RANDOMC_U01_23F = 1.0f / 8388608.0f;
60 static const float MCKL_RANDOMC_U01_24F = 1.0f / 16777216.0f;
61 static const float MCKL_RANDOMC_U01_31F = 1.0f / 2147483648.0f;
62 static const float MCKL_RANDOMC_U01_32F = 1.0f / 4294967296.0f;
63 static const float MCKL_RANDOMC_U01_33F = 1.0f / 8589934592.0f;
64 static const float MCKL_RANDOMC_U01_64F = 1.0f / 18446744073709551616.0f;
65 static const float MCKL_RANDOMC_U01_65F = 1.0f / 36893488147419103232.0f;
66 static const double MCKL_RANDOMC_U01_32D = 1.0 / 4294967296.0;
67 static const double MCKL_RANDOMC_U01_33D = 1.0 / 8589934592.0;
68 static const double MCKL_RANDOMC_U01_52D = 1.0 / 4503599627370496.0;
69 static const double MCKL_RANDOMC_U01_53D = 1.0 / 9007199254740992.0;
70 static const double MCKL_RANDOMC_U01_63D = 1.0 / 9223372036854775808.0;
71 static const double MCKL_RANDOMC_U01_64D = 1.0 / 18446744073709551616.0;
72 static const double MCKL_RANDOMC_U01_65D = 1.0 / 36893488147419103232.0;
73 #endif // MCKL_OPENCL
74 
77 static inline float mckl_u01_u32f(uint32_t u)
78 {
80 }
81 
84 static inline float mckl_u01_u64f(uint64_t u)
85 {
87 }
88 
89 #if !defined(MCKL_OPENCL) || MCKL_HAS_OPENCL_DOUBLE
90 
93 static inline double mckl_u01_u32d(uint32_t u)
94 {
96 }
97 
100 static inline double mckl_u01_u64d(uint64_t u)
101 {
103 }
104 
105 #endif // !defined(MCKL_OPENCL) || MCKL_HAS_OPENCL_DOUBLE
106 
109 static inline float mckl_u01_cc_u32f(uint32_t u)
110 {
111  return ((u & UINT32_C(0x40)) + (u & UINT32_C(0x7FFFFFC0))) *
113 }
114 
117 static inline float mckl_u01_co_u32f(uint32_t u)
118 {
119  return (u >> 8) * MCKL_RANDOMC_U01_24F;
120 }
121 
124 static inline float mckl_u01_oc_u32f(uint32_t u)
125 {
126  return (u >> 8) * MCKL_RANDOMC_U01_24F + MCKL_RANDOMC_U01_24F;
127 }
128 
131 static inline float mckl_u01_oo_u32f(uint32_t u)
132 {
133  return (u >> 9) * MCKL_RANDOMC_U01_23F + MCKL_RANDOMC_U01_24F;
134 }
135 
138 static inline float mckl_u01_cc_u64f(uint64_t u)
139 {
140 #ifdef __cplusplus
141  return mckl_u01_cc_u32f(static_cast<uint32_t>(u >> 32));
142 #else
143  return mckl_u01_cc_u32f(((uint32_t)(u >> 32)));
144 #endif
145 }
146 
149 static inline float mckl_u01_co_u64f(uint64_t u)
150 {
151 #ifdef __cplusplus
152  return mckl_u01_co_u32f(static_cast<uint32_t>(u >> 32));
153 #else
154  return mckl_u01_co_u32f(((uint32_t)(u >> 32)));
155 #endif
156 }
157 
160 static inline float mckl_u01_oc_u64f(uint64_t u)
161 {
162 #ifdef __cplusplus
163  return mckl_u01_oc_u32f(static_cast<uint32_t>(u >> 32));
164 #else
165  return mckl_u01_oc_u32f(((uint32_t)(u >> 32)));
166 #endif
167 }
168 
171 static inline float mckl_u01_oo_u64f(uint64_t u)
172 {
173 #ifdef __cplusplus
174  return mckl_u01_oo_u32f(static_cast<uint32_t>(u >> 32));
175 #else
176  return mckl_u01_oo_u32f(((uint32_t)(u >> 32)));
177 #endif
178 }
179 
180 #if !defined(MCKL_OPENCL) || MCKL_HAS_OPENCL_DOUBLE
181 
184 static inline double mckl_u01_cc_u32d(uint32_t u)
185 {
186 #ifdef __cplusplus
187  return (static_cast<double>(u & 1) + u) * MCKL_RANDOMC_U01_32D;
188 #else
189  return (((double) (u & 1)) + u) * MCKL_RANDOMC_U01_32D;
190 #endif
191 }
192 
195 static inline double mckl_u01_co_u32d(uint32_t u)
196 {
197  return u * MCKL_RANDOMC_U01_32D;
198 }
199 
202 static inline double mckl_u01_oc_u32d(uint32_t u)
203 {
205 }
206 
209 static inline double mckl_u01_oo_u32d(uint32_t u)
210 {
212 }
213 
216 static inline double mckl_u01_cc_u64d(uint64_t u)
217 {
218  return ((u & UINT64_C(0x7FFFFFFFFFFFFE00)) + (u & UINT64_C(0x200))) *
220 }
221 
224 static inline double mckl_u01_co_u64d(uint64_t u)
225 {
226  return (u >> 11) * MCKL_RANDOMC_U01_53D;
227 }
228 
231 static inline double mckl_u01_oc_u64d(uint64_t u)
232 {
233  return MCKL_RANDOMC_U01_53D + (u >> 11) * MCKL_RANDOMC_U01_53D;
234 }
235 
238 static inline double mckl_u01_oo_u64d(uint64_t u)
239 {
240  return MCKL_RANDOMC_U01_53D + (u >> 12) * MCKL_RANDOMC_U01_52D;
241 }
242 
243 #endif // !defined(MCKL_OPENCL) || MCKL_HAS_OPENCL_DOUBLE
244 
245 #endif // MCKL_RANDOMC_U01_H
#define UINT64_C(x)
Definition: opencl.h:44
static float mckl_u01_u64f(uint64_t u)
Converting 64-bit unsigned to single precision uniform .
Definition: u01.h:84
static float mckl_u01_u32f(uint32_t u)
Converting 32-bit unsigned to single precision uniform .
Definition: u01.h:77
static double mckl_u01_oo_u64d(uint64_t u)
Converting 64-bit unsigned to double precision uniform .
Definition: u01.h:238
static const float MCKL_RANDOMC_U01_65F
Definition: u01.h:65
static double mckl_u01_oc_u64d(uint64_t u)
Converting 64-bit unsigned to double precision uniform .
Definition: u01.h:231
static float mckl_u01_co_u64f(uint64_t u)
Converting 64-bit unsigned to single precision uniform .
Definition: u01.h:149
static float mckl_u01_oc_u64f(uint64_t u)
Converting 64-bit unsigned to single precision uniform .
Definition: u01.h:160
static float mckl_u01_oo_u32f(uint32_t u)
Converting 32-bit unsigned to single precision uniform .
Definition: u01.h:131
uint uint32_t
Definition: opencl.h:41
ulong uint64_t
Definition: opencl.h:42
static const double MCKL_RANDOMC_U01_65D
Definition: u01.h:72
static const double MCKL_RANDOMC_U01_32D
Definition: u01.h:66
static double mckl_u01_co_u32d(uint32_t u)
Converting 32-bit unsigned to double precision uniform .
Definition: u01.h:195
static const double MCKL_RANDOMC_U01_63D
Definition: u01.h:70
static const float MCKL_RANDOMC_U01_33F
Definition: u01.h:63
static float mckl_u01_oo_u64f(uint64_t u)
Converting 64-bit unsigned to single precision uniform .
Definition: u01.h:171
static double mckl_u01_u64d(uint64_t u)
Converting 64-bit unsigned to double precision uniform .
Definition: u01.h:100
static double mckl_u01_cc_u32d(uint32_t u)
Converting 32-bit unsigned to double precision uniform .
Definition: u01.h:184
static const double MCKL_RANDOMC_U01_33D
Definition: u01.h:67
static double mckl_u01_u32d(uint32_t u)
Converting 32-bit unsigned to double precision uniform .
Definition: u01.h:93
static const float MCKL_RANDOMC_U01_31F
Definition: u01.h:61
static double mckl_u01_co_u64d(uint64_t u)
Converting 64-bit unsigned to double precision uniform .
Definition: u01.h:224
static float mckl_u01_oc_u32f(uint32_t u)
Converting 32-bit unsigned to single precision uniform .
Definition: u01.h:124
static const float MCKL_RANDOMC_U01_24F
Definition: u01.h:60
static const float MCKL_RANDOMC_U01_64F
Definition: u01.h:64
static float mckl_u01_cc_u32f(uint32_t u)
Converting 32-bit unsigned to single precision uniform .
Definition: u01.h:109
static const float MCKL_RANDOMC_U01_23F
Definition: u01.h:59
static double mckl_u01_oo_u32d(uint32_t u)
Converting 32-bit unsigned to double precision uniform .
Definition: u01.h:209
static double mckl_u01_cc_u64d(uint64_t u)
Converting 64-bit unsigned to double precision uniform .
Definition: u01.h:216
#define UINT32_C(x)
Definition: opencl.h:43
static const double MCKL_RANDOMC_U01_64D
Definition: u01.h:71
static double mckl_u01_oc_u32d(uint32_t u)
Converting 32-bit unsigned to double precision uniform .
Definition: u01.h:202
static const double MCKL_RANDOMC_U01_53D
Definition: u01.h:69
static const double MCKL_RANDOMC_U01_52D
Definition: u01.h:68
static const float MCKL_RANDOMC_U01_32F
Definition: u01.h:62
static float mckl_u01_cc_u64f(uint64_t u)
Converting 64-bit unsigned to single precision uniform .
Definition: u01.h:138
static float mckl_u01_co_u32f(uint32_t u)
Converting 32-bit unsigned to single precision uniform .
Definition: u01.h:117