\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\frac{\mathsf{fma}\left(1 \cdot \frac{{\left(-2 \cdot \log u1\right)}^{0.5}}{6}, \cos \left(\left(2 \cdot \pi\right) \cdot u2\right), 0.5\right) \cdot \left(\left(1 \cdot \frac{{\left(-2 \cdot \log u1\right)}^{0.5}}{6}\right) \cdot \cos \left(\left(2 \cdot \pi\right) \cdot u2\right) - 0.5\right)}{\left(1 \cdot \frac{{\left(-2 \cdot \log u1\right)}^{0.5}}{6}\right) \cdot \cos \left(\left(2 \cdot \pi\right) \cdot u2\right) - 0.5}double f(double u1, double u2) {
double r75782 = 1.0;
double r75783 = 6.0;
double r75784 = r75782 / r75783;
double r75785 = -2.0;
double r75786 = u1;
double r75787 = log(r75786);
double r75788 = r75785 * r75787;
double r75789 = 0.5;
double r75790 = pow(r75788, r75789);
double r75791 = r75784 * r75790;
double r75792 = 2.0;
double r75793 = atan2(1.0, 0.0);
double r75794 = r75792 * r75793;
double r75795 = u2;
double r75796 = r75794 * r75795;
double r75797 = cos(r75796);
double r75798 = r75791 * r75797;
double r75799 = r75798 + r75789;
return r75799;
}
double f(double u1, double u2) {
double r75800 = 1.0;
double r75801 = -2.0;
double r75802 = u1;
double r75803 = log(r75802);
double r75804 = r75801 * r75803;
double r75805 = 0.5;
double r75806 = pow(r75804, r75805);
double r75807 = 6.0;
double r75808 = r75806 / r75807;
double r75809 = r75800 * r75808;
double r75810 = 2.0;
double r75811 = atan2(1.0, 0.0);
double r75812 = r75810 * r75811;
double r75813 = u2;
double r75814 = r75812 * r75813;
double r75815 = cos(r75814);
double r75816 = fma(r75809, r75815, r75805);
double r75817 = r75809 * r75815;
double r75818 = r75817 - r75805;
double r75819 = r75816 * r75818;
double r75820 = r75819 / r75818;
return r75820;
}



Bits error versus u1



Bits error versus u2
Initial program 0.4
rmApplied div-inv0.4
Applied associate-*l*0.4
Simplified0.3
rmApplied flip-+0.4
Simplified0.4
Final simplification0.4
herbie shell --seed 2020002 +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))