tract_linalg/generic/
erf.rs1#[allow(non_upper_case_globals)]
2#[allow(clippy::excessive_precision)]
3fn serf(x: &mut f32) {
4 const a1: f32 = 0.0705230784;
5 const a2: f32 = 0.0422820123;
6 const a3: f32 = 0.0092705272;
7 const a4: f32 = 0.0001520143;
8 const a5: f32 = 0.0002765672;
9 const a6: f32 = 0.0000430638;
10
11 let signum = x.signum();
12 let abs = x.abs();
13 let y = a6 * abs;
14 let y = (a5 + y) * abs;
15 let y = (a4 + y) * abs;
16 let y = (a3 + y) * abs;
17 let y = (a2 + y) * abs;
18 let y = (a1 + y) * abs;
19 let y = 1.0 - (y + 1.0).powi(16).recip();
20
21 *x = y.copysign(signum)
22}
23
24routine_ew_rust!(generic;
25 f32,
26 generic_erf_f32_4n,
27 4,
28 4,
29 fn run(x: &mut [f32], _: ()) {
30 debug_assert!(x.len() % Self::nr() == 0);
31 debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
32 x.iter_mut().for_each(serf)
33 },
34 func(Erf)
35);