62 #ifndef _r123_BOXMULLER_HPP__ 63 #define _r123_BOXMULLER_HPP__ 65 #include <Random123/features/compilerfeatures.h> 66 #include <Random123/uniform.hpp> 71 #if !defined(__CUDACC__) 83 #if !defined(RANDOM_ITERATOR_R123_NO_SINCOS) && defined(__APPLE__) 85 #define RANDOM_ITERATOR_R123_NO_SINCOS 1 88 #if RANDOM_ITERATOR_R123_NO_SINCOS 90 RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE
void sincosf(
91 float x,
float* s,
float* c) {
96 RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE
void sincos(
97 double x,
double* s,
double* c) {
103 #if !defined(CUDART_VERSION) || \ 104 CUDART_VERSION < 5000 106 RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE
void sincospif(
107 float x,
float* s,
float* c) {
108 const float PIf = 3.1415926535897932f;
109 sincosf(PIf * x, s, c);
112 RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE
void sincospi(
113 double x,
double* s,
double* c) {
114 const double PI = 3.1415926535897932;
115 sincos(PI * x, s, c);
123 RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE float2
124 boxmuller(uint32_t u0, uint32_t u1) {
127 sincospif(uneg11<float>(u0), &f.x, &f.y);
128 r = sqrtf(-2.f * logf(u01<float>(u1)));
138 RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE double2
139 boxmuller(uint64_t u0, uint64_t u1) {
143 sincospi(uneg11<double>(u0), &f.x, &f.y);
144 r =
sqrt(-2. * log(u01<double>(u1)));
detail::Root< D, 2, X > constexpr sqrt(quantity< D, X > const &x)
square root.