32 #ifndef VSMC_RNG_NORMAL01_H
33 #define VSMC_RNG_NORMAL01_H
81 #if VSMC_HAS_OPENCL_DOUBLE
83 #define NORMAL01_2x32 normal01_2x32_53
84 #define NORMAL01_2x32_INIT normal01_2x32_53_init
85 #define NORMAL01_2x32_RAND normal01_2x32_53_rand
87 #define NORMAL01_2x64 normal01_2x64_53
88 #define NORMAL01_2x64_INIT normal01_2x64_53_init
89 #define NORMAL01_2x64_RAND normal01_2x64_53_rand
91 #define NORMAL01_4x32 normal01_4x32_53
92 #define NORMAL01_4x32_INIT normal01_4x32_53_init
93 #define NORMAL01_4x32_RAND normal01_4x32_53_rand
95 #define NORMAL01_4x64 normal01_4x64_53
96 #define NORMAL01_4x64_INIT normal01_4x64_53_init
97 #define NORMAL01_4x64_RAND normal01_4x64_53_rand
99 #else // VSMC_HAS_OPENCL_DOUBLE
101 #define NORMAL01_2x32 normal01_2x32_24
102 #define NORMAL01_2x32_INIT normal01_2x32_24_init
103 #define NORMAL01_2x32_RAND normal01_2x32_24_rand
105 #define NORMAL01_4x32 normal01_4x32_24
106 #define NORMAL01_4x32_INIT normal01_4x32_24_init
107 #define NORMAL01_4x32_RAND normal01_4x32_24_rand
109 #endif // VSMC_HAS_OPENCL_DOUBLE
111 #define VSMC_DEFINE_RNG_NORMAL01(N, W, F, FT) \
115 unsigned char saved; \
116 } normal01_##N##x##W##_##F;
118 #define VSMC_DEFINE_RNG_NORMAL01_INIT(N, W, F, FT) \
119 VSMC_STATIC_INLINE void normal01_##N##x##W##_##F##_init ( \
120 normal01_##N##x##W##_##F *rnorm, cburng##N##x##W##_rng_t *rng) \
122 rnorm->u1 = u01_open_closed_##W##_##F(cburng##N##x##W##_rand(rng)); \
123 rnorm->u2 = u01_open_closed_##W##_##F(cburng##N##x##W##_rand(rng)); \
127 #define VSMC_DEFINE_RNG_NORMAL01_RAND(N, W, F, FT) \
128 VSMC_STATIC_INLINE FT normal01_##N##x##W##_##F##_rand ( \
129 normal01_##N##x##W##_##F *rnorm, cburng##N##x##W##_rng_t *rng) \
131 const FT c_2pi = 6.2831853071795865; \
132 if (rnorm->saved) { \
134 return sqrt(-2 * log(rnorm->u1)) * cos(c_2pi * rnorm->u2); \
136 normal01_##N##x##W##_##F##_init(rnorm, rng); \
137 return sqrt(-2 * log(rnorm->u1)) * sin(c_2pi * rnorm->u2); \
156 #if VSMC_HAS_OPENCL_DOUBLE
188 #endif // VSMC_HAS_OPENCL_DOUBLE
190 #endif // VSMC_RNG_NORMAL01_H
#define VSMC_DEFINE_RNG_NORMAL01_RAND(N, W, F, FT)
#define VSMC_DEFINE_RNG_NORMAL01(N, W, F, FT)
#define VSMC_DEFINE_RNG_NORMAL01_INIT(N, W, F, FT)