\left(\frac{1}{6} \cdot {\left(-2 \cdot \log u1\right)}^{0.5}\right) \cdot \cos \left(\left(2 \cdot \pi\right) \cdot u2\right) + 0.5\mathsf{log1p}\left(\mathsf{expm1}\left(\mathsf{fma}\left(\cos \left(\left(u2 \cdot \pi\right) \cdot 2\right), \frac{{\left(\log u1 \cdot -2\right)}^{0.5} \cdot 1}{6}, 0.5\right)\right)\right)double f(double u1, double u2) {
double r2701597 = 1.0;
double r2701598 = 6.0;
double r2701599 = r2701597 / r2701598;
double r2701600 = -2.0;
double r2701601 = u1;
double r2701602 = log(r2701601);
double r2701603 = r2701600 * r2701602;
double r2701604 = 0.5;
double r2701605 = pow(r2701603, r2701604);
double r2701606 = r2701599 * r2701605;
double r2701607 = 2.0;
double r2701608 = atan2(1.0, 0.0);
double r2701609 = r2701607 * r2701608;
double r2701610 = u2;
double r2701611 = r2701609 * r2701610;
double r2701612 = cos(r2701611);
double r2701613 = r2701606 * r2701612;
double r2701614 = r2701613 + r2701604;
return r2701614;
}
double f(double u1, double u2) {
double r2701615 = u2;
double r2701616 = atan2(1.0, 0.0);
double r2701617 = r2701615 * r2701616;
double r2701618 = 2.0;
double r2701619 = r2701617 * r2701618;
double r2701620 = cos(r2701619);
double r2701621 = u1;
double r2701622 = log(r2701621);
double r2701623 = -2.0;
double r2701624 = r2701622 * r2701623;
double r2701625 = 0.5;
double r2701626 = pow(r2701624, r2701625);
double r2701627 = 1.0;
double r2701628 = r2701626 * r2701627;
double r2701629 = 6.0;
double r2701630 = r2701628 / r2701629;
double r2701631 = fma(r2701620, r2701630, r2701625);
double r2701632 = expm1(r2701631);
double r2701633 = log1p(r2701632);
return r2701633;
}



Bits error versus u1



Bits error versus u2
Initial program 0.4
Simplified0.4
rmApplied associate-*l/0.3
rmApplied log1p-expm1-u0.3
Final simplification0.3
herbie shell --seed 2019170 +o rules:numerics
(FPCore (u1 u2)
:name "normal distribution"
:pre (and (<= 0.0 u1 1.0) (<= 0.0 u2 1.0))
(+ (* (* (/ 1.0 6.0) (pow (* -2.0 (log u1)) 0.5)) (cos (* (* 2.0 PI) u2))) 0.5))