@@ -18,6 +18,7 @@ use crate::simd_rng::SimdRng;
1818struct ZigTables {
1919 kn : [ i32 ; 128 ] ,
2020 wn : [ f64 ; 128 ] ,
21+ wn_f32 : [ f32 ; 128 ] ,
2122 fn_tab : [ f64 ; 128 ] ,
2223}
2324
@@ -27,6 +28,7 @@ fn zig_tables() -> &'static ZigTables {
2728 ZIG_TABLES . get_or_init ( || {
2829 let mut kn = [ 0i32 ; 128 ] ;
2930 let mut wn = [ 0.0f64 ; 128 ] ;
31+ let mut wn_f32 = [ 0.0f32 ; 128 ] ;
3032 let mut fn_tab = [ 0.0f64 ; 128 ] ;
3133
3234 let mut dn = 3.442619855899f64 ;
@@ -63,7 +65,16 @@ fn zig_tables() -> &'static ZigTables {
6365 wn[ i] = dn / m1;
6466 }
6567
66- ZigTables { kn, wn, fn_tab }
68+ for i in 0 ..128 {
69+ wn_f32[ i] = wn[ i] as f32 ;
70+ }
71+
72+ ZigTables {
73+ kn,
74+ wn,
75+ wn_f32,
76+ fn_tab,
77+ }
6778 } )
6879}
6980
@@ -79,8 +90,8 @@ fn nfix<T: SimdFloatExt>(hz: i32, iz: usize, tables: &ZigTables, rng: &mut SimdR
7990
8091 if iz == 0 {
8192 loop {
82- let u1: f64 = rng. random ( ) ;
83- let u2: f64 = rng. random ( ) ;
93+ let u1: f64 = rng. next_f64 ( ) ;
94+ let u2: f64 = rng. next_f64 ( ) ;
8495 let x_tail = -0.2904764 * ( -u1. ln ( ) ) ;
8596 let y = -u2. ln ( ) ;
8697 if y + y >= x_tail * x_tail {
@@ -94,13 +105,13 @@ fn nfix<T: SimdFloatExt>(hz: i32, iz: usize, tables: &ZigTables, rng: &mut SimdR
94105 }
95106 }
96107
97- if tables. fn_tab [ iz] + rng. random :: < f64 > ( ) * ( tables. fn_tab [ iz - 1 ] - tables. fn_tab [ iz] )
108+ if tables. fn_tab [ iz] + rng. next_f64 ( ) * ( tables. fn_tab [ iz - 1 ] - tables. fn_tab [ iz] )
98109 < ( -0.5 * x * x) . exp ( )
99110 {
100111 return T :: from_f64_fast ( x) ;
101112 }
102113
103- hz = rng. random :: < i32 > ( ) ;
114+ hz = rng. next_i32 ( ) ;
104115 iz = ( hz & 127 ) as usize ;
105116 if ( hz. unsigned_abs ( ) as i64 ) < tables. kn [ iz] as i64 {
106117 return T :: from_f64_fast ( hz as f64 * tables. wn [ iz] ) ;
@@ -191,16 +202,29 @@ impl<T: SimdFloatExt, const N: usize> SimdNormal<T, N> {
191202 let abs_hz = hz. abs ( ) ;
192203 let accept = abs_hz. simd_lt ( kn_vals) ;
193204
194- let wn_arr: [ T ; 8 ] = [
195- T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 0 ] as usize ) ) ,
196- T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 1 ] as usize ) ) ,
197- T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 2 ] as usize ) ) ,
198- T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 3 ] as usize ) ) ,
199- T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 4 ] as usize ) ) ,
200- T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 5 ] as usize ) ) ,
201- T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 6 ] as usize ) ) ,
202- T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 7 ] as usize ) ) ,
203- ] ;
205+ let wn_arr: [ T ; 8 ] = if T :: PREFERS_F32_WN {
206+ [
207+ T :: from_f32_fast ( * tables. wn_f32 . get_unchecked ( iz_arr[ 0 ] as usize ) ) ,
208+ T :: from_f32_fast ( * tables. wn_f32 . get_unchecked ( iz_arr[ 1 ] as usize ) ) ,
209+ T :: from_f32_fast ( * tables. wn_f32 . get_unchecked ( iz_arr[ 2 ] as usize ) ) ,
210+ T :: from_f32_fast ( * tables. wn_f32 . get_unchecked ( iz_arr[ 3 ] as usize ) ) ,
211+ T :: from_f32_fast ( * tables. wn_f32 . get_unchecked ( iz_arr[ 4 ] as usize ) ) ,
212+ T :: from_f32_fast ( * tables. wn_f32 . get_unchecked ( iz_arr[ 5 ] as usize ) ) ,
213+ T :: from_f32_fast ( * tables. wn_f32 . get_unchecked ( iz_arr[ 6 ] as usize ) ) ,
214+ T :: from_f32_fast ( * tables. wn_f32 . get_unchecked ( iz_arr[ 7 ] as usize ) ) ,
215+ ]
216+ } else {
217+ [
218+ T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 0 ] as usize ) ) ,
219+ T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 1 ] as usize ) ) ,
220+ T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 2 ] as usize ) ) ,
221+ T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 3 ] as usize ) ) ,
222+ T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 4 ] as usize ) ) ,
223+ T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 5 ] as usize ) ) ,
224+ T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 6 ] as usize ) ) ,
225+ T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 7 ] as usize ) ) ,
226+ ]
227+ } ;
204228 let hz_float = T :: simd_from_i32x8 ( hz) ;
205229 let wn_simd = T :: simd_from_array ( wn_arr) ;
206230 let result = hz_float * wn_simd;
@@ -308,16 +332,29 @@ impl<T: SimdFloatExt, const N: usize> SimdNormal<T, N> {
308332 let abs_hz = hz. abs ( ) ;
309333 let accept = abs_hz. simd_lt ( kn_vals) ;
310334
311- let wn_arr: [ T ; 8 ] = [
312- T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 0 ] as usize ) ) ,
313- T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 1 ] as usize ) ) ,
314- T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 2 ] as usize ) ) ,
315- T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 3 ] as usize ) ) ,
316- T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 4 ] as usize ) ) ,
317- T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 5 ] as usize ) ) ,
318- T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 6 ] as usize ) ) ,
319- T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 7 ] as usize ) ) ,
320- ] ;
335+ let wn_arr: [ T ; 8 ] = if T :: PREFERS_F32_WN {
336+ [
337+ T :: from_f32_fast ( * tables. wn_f32 . get_unchecked ( iz_arr[ 0 ] as usize ) ) ,
338+ T :: from_f32_fast ( * tables. wn_f32 . get_unchecked ( iz_arr[ 1 ] as usize ) ) ,
339+ T :: from_f32_fast ( * tables. wn_f32 . get_unchecked ( iz_arr[ 2 ] as usize ) ) ,
340+ T :: from_f32_fast ( * tables. wn_f32 . get_unchecked ( iz_arr[ 3 ] as usize ) ) ,
341+ T :: from_f32_fast ( * tables. wn_f32 . get_unchecked ( iz_arr[ 4 ] as usize ) ) ,
342+ T :: from_f32_fast ( * tables. wn_f32 . get_unchecked ( iz_arr[ 5 ] as usize ) ) ,
343+ T :: from_f32_fast ( * tables. wn_f32 . get_unchecked ( iz_arr[ 6 ] as usize ) ) ,
344+ T :: from_f32_fast ( * tables. wn_f32 . get_unchecked ( iz_arr[ 7 ] as usize ) ) ,
345+ ]
346+ } else {
347+ [
348+ T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 0 ] as usize ) ) ,
349+ T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 1 ] as usize ) ) ,
350+ T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 2 ] as usize ) ) ,
351+ T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 3 ] as usize ) ) ,
352+ T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 4 ] as usize ) ) ,
353+ T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 5 ] as usize ) ) ,
354+ T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 6 ] as usize ) ) ,
355+ T :: from_f64_fast ( * tables. wn . get_unchecked ( iz_arr[ 7 ] as usize ) ) ,
356+ ]
357+ } ;
321358 let hz_float = T :: simd_from_i32x8 ( hz) ;
322359 let wn_simd = T :: simd_from_array ( wn_arr) ;
323360 let result = hz_float * wn_simd;
0 commit comments