\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\mathsf{fma}\left(0.166666666666666657 \cdot {\left({-1}^{1} \cdot \left({-2}^{1} \cdot {\left(\log \left(\frac{1}{u1}\right)\right)}^{1}\right)\right)}^{0.5}, \cos \left(\left(\left(2 \cdot \pi\right) \cdot \sqrt{u2}\right) \cdot \sqrt{u2}\right), 0.5\right)double f(double u1, double u2) {
double r58471 = 1.0;
double r58472 = 6.0;
double r58473 = r58471 / r58472;
double r58474 = -2.0;
double r58475 = u1;
double r58476 = log(r58475);
double r58477 = r58474 * r58476;
double r58478 = 0.5;
double r58479 = pow(r58477, r58478);
double r58480 = r58473 * r58479;
double r58481 = 2.0;
double r58482 = atan2(1.0, 0.0);
double r58483 = r58481 * r58482;
double r58484 = u2;
double r58485 = r58483 * r58484;
double r58486 = cos(r58485);
double r58487 = r58480 * r58486;
double r58488 = r58487 + r58478;
return r58488;
}
double f(double u1, double u2) {
double r58489 = 0.16666666666666666;
double r58490 = -1.0;
double r58491 = 1.0;
double r58492 = pow(r58490, r58491);
double r58493 = -2.0;
double r58494 = pow(r58493, r58491);
double r58495 = 1.0;
double r58496 = u1;
double r58497 = r58495 / r58496;
double r58498 = log(r58497);
double r58499 = pow(r58498, r58491);
double r58500 = r58494 * r58499;
double r58501 = r58492 * r58500;
double r58502 = 0.5;
double r58503 = pow(r58501, r58502);
double r58504 = r58489 * r58503;
double r58505 = 2.0;
double r58506 = atan2(1.0, 0.0);
double r58507 = r58505 * r58506;
double r58508 = u2;
double r58509 = sqrt(r58508);
double r58510 = r58507 * r58509;
double r58511 = r58510 * r58509;
double r58512 = cos(r58511);
double r58513 = fma(r58504, r58512, r58502);
return r58513;
}



Bits error versus u1



Bits error versus u2
Initial program 0.4
Simplified0.4
rmApplied associate-*l/0.3
rmApplied add-sqr-sqrt0.3
Applied associate-*r*0.3
Taylor expanded around inf 0.4
Final simplification0.4
herbie shell --seed 2020025 +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))