\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{fma}\left(1 \cdot \frac{1}{\frac{6}{{\left(-2 \cdot \log u1\right)}^{0.5}}}, \cos \left(\left(\left(2 \cdot \pi\right) \cdot \sqrt{u2}\right) \cdot \sqrt{u2}\right), 0.5\right)double f(double u1, double u2) {
double r68611 = 1.0;
double r68612 = 6.0;
double r68613 = r68611 / r68612;
double r68614 = -2.0;
double r68615 = u1;
double r68616 = log(r68615);
double r68617 = r68614 * r68616;
double r68618 = 0.5;
double r68619 = pow(r68617, r68618);
double r68620 = r68613 * r68619;
double r68621 = 2.0;
double r68622 = atan2(1.0, 0.0);
double r68623 = r68621 * r68622;
double r68624 = u2;
double r68625 = r68623 * r68624;
double r68626 = cos(r68625);
double r68627 = r68620 * r68626;
double r68628 = r68627 + r68618;
return r68628;
}
double f(double u1, double u2) {
double r68629 = 1.0;
double r68630 = 1.0;
double r68631 = 6.0;
double r68632 = -2.0;
double r68633 = u1;
double r68634 = log(r68633);
double r68635 = r68632 * r68634;
double r68636 = 0.5;
double r68637 = pow(r68635, r68636);
double r68638 = r68631 / r68637;
double r68639 = r68630 / r68638;
double r68640 = r68629 * r68639;
double r68641 = 2.0;
double r68642 = atan2(1.0, 0.0);
double r68643 = r68641 * r68642;
double r68644 = u2;
double r68645 = sqrt(r68644);
double r68646 = r68643 * r68645;
double r68647 = r68646 * r68645;
double r68648 = cos(r68647);
double r68649 = fma(r68640, r68648, r68636);
return r68649;
}



Bits error versus u1



Bits error versus u2
Initial program 0.4
Simplified0.4
rmApplied div-inv0.4
Applied associate-*l*0.4
Simplified0.3
rmApplied add-sqr-sqrt0.3
Applied associate-*r*0.3
rmApplied clear-num0.4
Final simplification0.4
herbie shell --seed 2019325 +o rules:numerics
(FPCore (u1 u2)
:name "normal distribution"
:precision binary64
:pre (and (<= 0.0 u1 1) (<= 0.0 u2 1))
(+ (* (* (/ 1 6) (pow (* -2 (log u1)) 0.5)) (cos (* (* 2 PI) u2))) 0.5))