Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef _random123_u01_dot_h_
00033 #define _random123_u01_dot_h_
00034
00035 #include "features/compilerfeatures.h"
00036
00077
00078
00079
00080
00081
00082
00083 #define R123_0x1p_32f (1.f/4294967296.f)
00084 #define R123_0x1p_24f (1.f/16777216.f)
00085 #define R123_0x1fffffep_25f (16777215.f * R123_0x1p_24f * R123_0x1p_24f)
00086 #define R123_0x1p_64 (1./(4294967296.*4294967296.))
00087 #define R123_0x1p_53 (1./(4294967296.*2097152.))
00088 #define R123_0x1fffffffffffffp_54 (9007199254740991.*R123_0x1p_53*R123_0x1p_53)
00089 #define R123_0x1p_32 (1./4294967296.)
00090 #define R123_0x100000001p_32 (4294967297.*R123_0x1p_32*R123_0x1p_32)
00091
00094 #ifdef __cplusplus
00095 extern "C"{
00096 #endif
00097
00098
00099 R123_CUDA_DEVICE R123_STATIC_INLINE float u01_closed_closed_32_24(uint32_t i){
00100 return i*R123_0x1p_32f;
00101 }
00102
00103 R123_CUDA_DEVICE R123_STATIC_INLINE float u01_closed_open_32_24(uint32_t i){
00104 return (i>>8)*R123_0x1p_24f;
00105 }
00106
00107 R123_CUDA_DEVICE R123_STATIC_INLINE float u01_open_closed_32_24(uint32_t i){
00108 return (1+(i>>8))*R123_0x1p_24f;
00109 }
00110
00111 R123_CUDA_DEVICE R123_STATIC_INLINE float u01_open_open_32_24(uint32_t i){
00112 return (1+(i>>8))*R123_0x1fffffep_25f;
00113 }
00114
00115 #if R123_USE_U01_DOUBLE
00116
00117 R123_CUDA_DEVICE R123_STATIC_INLINE double u01_closed_closed_64_53(uint64_t i){
00118 return i*R123_0x1p_64;
00119 }
00120
00121 R123_CUDA_DEVICE R123_STATIC_INLINE double u01_closed_open_64_53(uint64_t i){
00122 return (i>>11)*R123_0x1p_53;
00123 }
00124
00125 R123_CUDA_DEVICE R123_STATIC_INLINE double u01_open_closed_64_53(uint64_t i){
00126 return (1+(i>>11))*R123_0x1p_53;
00127 }
00128
00129 R123_CUDA_DEVICE R123_STATIC_INLINE double u01_open_open_64_53(uint64_t i){
00130 return (1+(i>>11))*R123_0x1fffffffffffffp_54;
00131 }
00132
00133
00134 R123_CUDA_DEVICE R123_STATIC_INLINE double u01_closed_closed_32_53(uint32_t i){
00135 return i*R123_0x100000001p_32;
00136 }
00137
00138 R123_CUDA_DEVICE R123_STATIC_INLINE double u01_closed_open_32_53(uint32_t i){
00139 return i*R123_0x1p_32;
00140 }
00141
00142 R123_CUDA_DEVICE R123_STATIC_INLINE double u01_open_closed_32_53(uint32_t i){
00143 return (1.+i)*R123_0x1p_32;
00144 }
00145
00146 R123_CUDA_DEVICE R123_STATIC_INLINE double u01_open_open_32_53(uint32_t i){
00147 return (0.5+i)*R123_0x1p_32;
00148 }
00149 #endif
00150
00151 #ifdef __cplusplus
00152 }
00153 #endif
00154
00156 #endif