\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(1 \cdot \mathsf{log1p}\left(\mathsf{expm1}\left(\frac{{\left(-2 \cdot \log u1\right)}^{0.5}}{6}\right)\right)\right) \cdot \cos \left(\left(2 \cdot \pi\right) \cdot u2\right) + 0.5double f(double u1, double u2) {
double r69091 = 1.0;
double r69092 = 6.0;
double r69093 = r69091 / r69092;
double r69094 = -2.0;
double r69095 = u1;
double r69096 = log(r69095);
double r69097 = r69094 * r69096;
double r69098 = 0.5;
double r69099 = pow(r69097, r69098);
double r69100 = r69093 * r69099;
double r69101 = 2.0;
double r69102 = atan2(1.0, 0.0);
double r69103 = r69101 * r69102;
double r69104 = u2;
double r69105 = r69103 * r69104;
double r69106 = cos(r69105);
double r69107 = r69100 * r69106;
double r69108 = r69107 + r69098;
return r69108;
}
double f(double u1, double u2) {
double r69109 = 1.0;
double r69110 = -2.0;
double r69111 = u1;
double r69112 = log(r69111);
double r69113 = r69110 * r69112;
double r69114 = 0.5;
double r69115 = pow(r69113, r69114);
double r69116 = 6.0;
double r69117 = r69115 / r69116;
double r69118 = expm1(r69117);
double r69119 = log1p(r69118);
double r69120 = r69109 * r69119;
double r69121 = 2.0;
double r69122 = atan2(1.0, 0.0);
double r69123 = r69121 * r69122;
double r69124 = u2;
double r69125 = r69123 * r69124;
double r69126 = cos(r69125);
double r69127 = r69120 * r69126;
double r69128 = r69127 + r69114;
return r69128;
}



Bits error versus u1



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