MCPcopy Index your code
hub / github.com/RustPython/RustPython / normal_dist_inv_cdf

Function normal_dist_inv_cdf

crates/stdlib/src/statistics.rs:12–126  ·  view source on GitHub ↗
(p: f64, mu: f64, sigma: f64)

Source from the content-addressed store, hash-verified

10 reason = "constants are kept at CPython precision"
11 )]
12 fn normal_dist_inv_cdf(p: f64, mu: f64, sigma: f64) -> Option<f64> {
13 if p <= 0.0 || p >= 1.0 {
14 return None;
15 }
16
17 let q = p - 0.5;
18 if q.abs() <= 0.425 {
19 let r = 0.180625 - q * q;
20 // Hash sum-55.8831928806149014439
21 let num = (((((((2.5090809287301226727e+3 * r + 3.3430575583588128105e+4) * r
22 + 6.7265770927008700853e+4)
23 * r
24 + 4.5921953931549871457e+4)
25 * r
26 + 1.3731693765509461125e+4)
27 * r
28 + 1.9715909503065514427e+3)
29 * r
30 + 1.3314166789178437745e+2)
31 * r
32 + 3.3871328727963666080e+0)
33 * q;
34 let den = ((((((5.2264952788528545610e+3 * r + 2.8729085735721942674e+4) * r
35 + 3.9307895800092710610e+4)
36 * r
37 + 2.1213794301586595867e+4)
38 * r
39 + 5.3941960214247511077e+3)
40 * r
41 + 6.8718700749205790830e+2)
42 * r
43 + 4.2313330701600911252e+1)
44 * r
45 + 1.0;
46 if den == 0.0 {
47 return None;
48 }
49 let x = num / den;
50 return Some(mu + (x * sigma));
51 }
52 let r = if q <= 0.0 { p } else { 1.0 - p };
53 if r <= 0.0 || r >= 1.0 {
54 return None;
55 }
56 let r = (-(r.ln())).sqrt();
57 let num;
58 let den;
59 #[allow(
60 clippy::excessive_precision,
61 reason = "piecewise polynomial coefficients match CPython"
62 )]
63 if r <= 5.0 {
64 let r = r - 1.6;
65 // Hash sum-49.33206503301610289036
66 num = ((((((7.74545014278341407640e-4 * r + 2.27238449892691845833e-2) * r
67 + 2.41780725177450611770e-1)
68 * r
69 + 1.27045825245236838258e+0)

Callers 1

_normal_dist_inv_cdfFunction · 0.85

Calls 4

absMethod · 0.80
SomeClass · 0.50
sqrtMethod · 0.45
lnMethod · 0.45

Tested by

no test coverage detected