1- const ALLOWED_RANDN_SCALARS = Union{Float16, Float32, Float64}
1+ const ALLOWED_RANDN_SCALARS = Union{
2+ Float16, Float32, Float64
3+ }
24
3- const U24_MAX_SAFE_MIDPOINT = UInt32 (0x00fffffe ) # 2^24 - 2
4- const U53_MAX_SAFE_MIDPOINT = UInt64 (0x001ffffffffffffe ) # 2^53 - 2
5- const MIDPOINT_SCALE_F32 = ldexp (Float32 (1 ), - 24 ) # 2^-24
6- const MIDPOINT_SCALE_F64 = ldexp (Float64 (1 ), - 53 ) # 2^-53
5+ const OPEN01_MAX_MIDPOINT_INDEX_F32 = UInt32 (0x00fffffe )
6+ const OPEN01_MAX_MIDPOINT_INDEX_F64 = UInt64 (0x001ffffffffffffe )
7+ const OPEN01_MIDPOINT_SCALE_F32 = ldexp (Float32 (1 ), - 24 )
8+ const OPEN01_MIDPOINT_SCALE_F64 = ldexp (Float64 (1 ), - 53 )
79
810
911
@@ -19,16 +21,16 @@ Avoiding 0 is essential for Box-Muller due to the logarithm functions.
1921# Convert random UInt32 bits to Float32 in (0, 1) using midpoint mapping on a 24-bit grid.
2022@inline function uint32_to_open_unit_float32_midpoint (u:: UInt32 ):: Float32
2123 # `min` keeps the top midpoint below one after Float32 rounding.
22- k = min (u >> 8 , U24_MAX_SAFE_MIDPOINT )
23- return (Float32 (k) + 0.5f0 ) * MIDPOINT_SCALE_F32
24+ k = min (u >> 8 , OPEN01_MAX_MIDPOINT_INDEX_F32 )
25+ return (Float32 (k) + 0.5f0 ) * OPEN01_MIDPOINT_SCALE_F32
2426end
2527
2628
2729# Convert random UInt64 bits to Float64 in (0, 1) using midpoint mapping on a 53-bit grid.
2830@inline function uint64_to_open_unit_float64_midpoint (u:: UInt64 ):: Float64
2931 # `min` keeps the top midpoint below one after Float64 rounding.
30- k = min (u >> 11 , U53_MAX_SAFE_MIDPOINT )
31- return (Float64 (k) + 0.5 ) * MIDPOINT_SCALE_F64
32+ k = min (u >> 11 , OPEN01_MAX_MIDPOINT_INDEX_F64 )
33+ return (Float64 (k) + 0.5 ) * OPEN01_MIDPOINT_SCALE_F64
3234end
3335
3436
201203 # CPU settings
202204 max_tasks::Int=Threads.nthreads(),
203205 min_elems::Int=1,
204-
205- # Implementation choice
206206 prefer_threads::Bool=true,
207207
208208 # GPU settings
@@ -215,6 +215,8 @@ For `v[i]`, the normal stream counter is `rng.offset + UInt64(i - 1)` in linear
215215Values are generated using Box-Muller from midpoint-open uniforms in `(0, 1)`.
216216
217217After filling `v`, `rng.offset` advances by `length(v)`.
218+
219+ It can be called without an `rng`, in which case the default `CounterRNG` will be used.
218220"""
219221function randn! (
220222 rng:: CounterRNG ,
269271 backend::Backend,
270272 ::Type{T},
271273 dims::Integer...;
274+
275+ # CPU settings
272276 max_tasks::Int=Threads.nthreads(),
273277 min_elems::Int=1,
274278 prefer_threads::Bool=true,
279+
280+ # GPU settings
275281 block_size::Int=256,
276282 ) where T
277283
@@ -283,12 +289,17 @@ function randn(
283289 backend:: Backend ,
284290 :: Type{T} ,
285291 dims:: Integer... ;
292+
293+ # CPU settings
286294 max_tasks:: Int = Threads. nthreads (),
287295 min_elems:: Int = 1 ,
288296 prefer_threads:: Bool = true ,
297+
298+ # GPU settings
289299 block_size:: Int = 256 ,
290300) where T
291- return _allocate_and_fill (
301+ @argcheck T <: ALLOWED_RANDN_SCALARS " Unsupported eltype $T . Supported: $(ALLOWED_RANDN_SCALARS) "
302+ return _allocate_and_fill_rand (
292303 randn!, rng, backend, T, dims... ;
293304 max_tasks, min_elems, prefer_threads, block_size,
294305 )
@@ -299,9 +310,13 @@ function randn(
299310 backend:: Backend ,
300311 :: Type{T} ,
301312 dims:: Integer... ;
313+
314+ # CPU settings
302315 max_tasks:: Int = Threads. nthreads (),
303316 min_elems:: Int = 1 ,
304317 prefer_threads:: Bool = true ,
318+
319+ # GPU settings
305320 block_size:: Int = 256 ,
306321) where T
307322 return randn (
0 commit comments