\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(0.1666666666666666574148081281236954964697 \cdot {\left({\left(\log u1\right)}^{1} \cdot {-2}^{1}\right)}^{0.5}\right) \cdot \cos \left(\left(2 \cdot \pi\right) \cdot u2\right) + 0.5double f(double u1, double u2) {
double r87080 = 1.0;
double r87081 = 6.0;
double r87082 = r87080 / r87081;
double r87083 = -2.0;
double r87084 = u1;
double r87085 = log(r87084);
double r87086 = r87083 * r87085;
double r87087 = 0.5;
double r87088 = pow(r87086, r87087);
double r87089 = r87082 * r87088;
double r87090 = 2.0;
double r87091 = atan2(1.0, 0.0);
double r87092 = r87090 * r87091;
double r87093 = u2;
double r87094 = r87092 * r87093;
double r87095 = cos(r87094);
double r87096 = r87089 * r87095;
double r87097 = r87096 + r87087;
return r87097;
}
double f(double u1, double u2) {
double r87098 = 0.16666666666666666;
double r87099 = u1;
double r87100 = log(r87099);
double r87101 = 1.0;
double r87102 = pow(r87100, r87101);
double r87103 = -2.0;
double r87104 = pow(r87103, r87101);
double r87105 = r87102 * r87104;
double r87106 = 0.5;
double r87107 = pow(r87105, r87106);
double r87108 = r87098 * r87107;
double r87109 = 2.0;
double r87110 = atan2(1.0, 0.0);
double r87111 = r87109 * r87110;
double r87112 = u2;
double r87113 = r87111 * r87112;
double r87114 = cos(r87113);
double r87115 = r87108 * r87114;
double r87116 = r87115 + r87106;
return r87116;
}



Bits error versus u1



Bits error versus u2
Results
Initial program 0.4
rmApplied expm1-log1p-u0.5
Taylor expanded around 0 0.4
Final simplification0.4
herbie shell --seed 2019306 +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))