double f(double u1, double u2) {
double r32548116 = 1.0;
double r32548117 = 6.0;
double r32548118 = r32548116 / r32548117;
double r32548119 = -2.0;
double r32548120 = u1;
double r32548121 = log(r32548120);
double r32548122 = r32548119 * r32548121;
double r32548123 = 0.5;
double r32548124 = pow(r32548122, r32548123);
double r32548125 = r32548118 * r32548124;
double r32548126 = 2.0;
double r32548127 = atan2(1.0, 0.0);
double r32548128 = r32548126 * r32548127;
double r32548129 = u2;
double r32548130 = r32548128 * r32548129;
double r32548131 = cos(r32548130);
double r32548132 = r32548125 * r32548131;
double r32548133 = r32548132 + r32548123;
return r32548133;
}
double f(double u1, double u2) {
double r32548134 = atan2(1.0, 0.0);
double r32548135 = 2.0;
double r32548136 = r32548134 * r32548135;
double r32548137 = u2;
double r32548138 = r32548136 * r32548137;
double r32548139 = cos(r32548138);
double r32548140 = -2.0;
double r32548141 = u1;
double r32548142 = log(r32548141);
double r32548143 = r32548140 * r32548142;
double r32548144 = 0.5;
double r32548145 = pow(r32548143, r32548144);
double r32548146 = 6.0;
double r32548147 = r32548145 / r32548146;
double r32548148 = fma(r32548139, r32548147, r32548144);
return r32548148;
}
\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(\left(\cos \left(\left(\pi \cdot 2\right) \cdot u2\right)\right) \cdot \left(\frac{{\left(-2 \cdot \log u1\right)}^{0.5}}{6}\right) + 0.5)_*


Bits error versus u1



Bits error versus u2
Initial program 0.4
Simplified0.3
Taylor expanded around inf 0.3
Simplified0.3
Final simplification0.3
herbie shell --seed 2019102 +o rules:numerics
(FPCore (u1 u2)
:name "normal distribution"
:pre (and (<= 0 u1 1) (<= 0 u2 1))
(+ (* (* (/ 1 6) (pow (* -2 (log u1)) 0.5)) (cos (* (* 2 PI) u2))) 0.5))