54 lines
1.1 KiB
Rust
54 lines
1.1 KiB
Rust
pub(crate) fn erf(x: f64) -> f64 {
|
|
let cof = vec![
|
|
-1.3026537197817094,
|
|
6.419_697_923_564_902e-1,
|
|
1.9476473204185836e-2,
|
|
-9.561_514_786_808_63e-3,
|
|
-9.46595344482036e-4,
|
|
3.66839497852761e-4,
|
|
4.2523324806907e-5,
|
|
-2.0278578112534e-5,
|
|
-1.624290004647e-6,
|
|
1.303655835580e-6,
|
|
1.5626441722e-8,
|
|
-8.5238095915e-8,
|
|
6.529054439e-9,
|
|
5.059343495e-9,
|
|
-9.91364156e-10,
|
|
-2.27365122e-10,
|
|
9.6467911e-11,
|
|
2.394038e-12,
|
|
-6.886027e-12,
|
|
8.94487e-13,
|
|
3.13092e-13,
|
|
-1.12708e-13,
|
|
3.81e-16,
|
|
7.106e-15,
|
|
-1.523e-15,
|
|
-9.4e-17,
|
|
1.21e-16,
|
|
-2.8e-17,
|
|
];
|
|
|
|
let mut d = 0.0;
|
|
let mut dd = 0.0;
|
|
|
|
let x_abs = x.abs();
|
|
|
|
let t = 2.0 / (2.0 + x_abs);
|
|
let ty = 4.0 * t - 2.0;
|
|
|
|
for j in (1..=cof.len() - 1).rev() {
|
|
let tmp = d;
|
|
d = ty * d - dd + cof[j];
|
|
dd = tmp;
|
|
}
|
|
|
|
let res = t * f64::exp(-x_abs * x_abs + 0.5 * (cof[0] + ty * d) - dd);
|
|
if x < 0.0 {
|
|
res - 1.0
|
|
} else {
|
|
1.0 - res
|
|
}
|
|
}
|