\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{1 \cdot {\left(-2 \cdot \log u1\right)}^{0.5}}{6} \cdot \cos \left(\mathsf{expm1}\left(\mathsf{log1p}\left(\left(2 \cdot \pi\right) \cdot u2\right)\right)\right) + 0.5double f(double u1, double u2) {
double r63023 = 1.0;
double r63024 = 6.0;
double r63025 = r63023 / r63024;
double r63026 = -2.0;
double r63027 = u1;
double r63028 = log(r63027);
double r63029 = r63026 * r63028;
double r63030 = 0.5;
double r63031 = pow(r63029, r63030);
double r63032 = r63025 * r63031;
double r63033 = 2.0;
double r63034 = atan2(1.0, 0.0);
double r63035 = r63033 * r63034;
double r63036 = u2;
double r63037 = r63035 * r63036;
double r63038 = cos(r63037);
double r63039 = r63032 * r63038;
double r63040 = r63039 + r63030;
return r63040;
}
double f(double u1, double u2) {
double r63041 = 1.0;
double r63042 = -2.0;
double r63043 = u1;
double r63044 = log(r63043);
double r63045 = r63042 * r63044;
double r63046 = 0.5;
double r63047 = pow(r63045, r63046);
double r63048 = r63041 * r63047;
double r63049 = 6.0;
double r63050 = r63048 / r63049;
double r63051 = 2.0;
double r63052 = atan2(1.0, 0.0);
double r63053 = r63051 * r63052;
double r63054 = u2;
double r63055 = r63053 * r63054;
double r63056 = log1p(r63055);
double r63057 = expm1(r63056);
double r63058 = cos(r63057);
double r63059 = r63050 * r63058;
double r63060 = r63059 + r63046;
return r63060;
}



Bits error versus u1



Bits error versus u2
Results
Initial program 0.4
rmApplied associate-*l/0.3
rmApplied expm1-log1p-u0.3
Final simplification0.3
herbie shell --seed 2020036 +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))