\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(0.1666666666666666574148081281236954964697, {\left({-1}^{1} \cdot \left({-2}^{1} \cdot {\left(\log \left(\frac{1}{u1}\right)\right)}^{1}\right)\right)}^{0.5} \cdot \cos \left(2 \cdot \left(u2 \cdot \pi\right)\right), 0.5\right)double f(double u1, double u2) {
double r63591 = 1.0;
double r63592 = 6.0;
double r63593 = r63591 / r63592;
double r63594 = -2.0;
double r63595 = u1;
double r63596 = log(r63595);
double r63597 = r63594 * r63596;
double r63598 = 0.5;
double r63599 = pow(r63597, r63598);
double r63600 = r63593 * r63599;
double r63601 = 2.0;
double r63602 = atan2(1.0, 0.0);
double r63603 = r63601 * r63602;
double r63604 = u2;
double r63605 = r63603 * r63604;
double r63606 = cos(r63605);
double r63607 = r63600 * r63606;
double r63608 = r63607 + r63598;
return r63608;
}
double f(double u1, double u2) {
double r63609 = 0.16666666666666666;
double r63610 = -1.0;
double r63611 = 1.0;
double r63612 = pow(r63610, r63611);
double r63613 = -2.0;
double r63614 = pow(r63613, r63611);
double r63615 = 1.0;
double r63616 = u1;
double r63617 = r63615 / r63616;
double r63618 = log(r63617);
double r63619 = pow(r63618, r63611);
double r63620 = r63614 * r63619;
double r63621 = r63612 * r63620;
double r63622 = 0.5;
double r63623 = pow(r63621, r63622);
double r63624 = 2.0;
double r63625 = u2;
double r63626 = atan2(1.0, 0.0);
double r63627 = r63625 * r63626;
double r63628 = r63624 * r63627;
double r63629 = cos(r63628);
double r63630 = r63623 * r63629;
double r63631 = fma(r63609, r63630, r63622);
return r63631;
}



Bits error versus u1



Bits error versus u2
Initial program 0.4
Simplified0.4
Taylor expanded around inf 0.4
Simplified0.4
Final simplification0.4
herbie shell --seed 2019354 +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))