Average Error: 0.4 → 0.4
Time: 10.6s
Precision: 64
\[0.0 \le u1 \le 1 \land 0.0 \le u2 \le 1\]
\[\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.1666666666666666574148081281236954964697, {\left({-1}^{1} \cdot \left({-2}^{1} \cdot {\left(\log \left(\frac{1}{u1}\right)\right)}^{1}\right)\right)}^{0.5} \cdot \cos \left(2 \cdot \left(u2 \cdot \pi\right)\right), 0.5\right)\]
\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.1666666666666666574148081281236954964697, {\left({-1}^{1} \cdot \left({-2}^{1} \cdot {\left(\log \left(\frac{1}{u1}\right)\right)}^{1}\right)\right)}^{0.5} \cdot \cos \left(2 \cdot \left(u2 \cdot \pi\right)\right), 0.5\right)
double f(double u1, double u2) {
        double r63591 = 1.0;
        double r63592 = 6.0;
        double r63593 = r63591 / r63592;
        double r63594 = -2.0;
        double r63595 = u1;
        double r63596 = log(r63595);
        double r63597 = r63594 * r63596;
        double r63598 = 0.5;
        double r63599 = pow(r63597, r63598);
        double r63600 = r63593 * r63599;
        double r63601 = 2.0;
        double r63602 = atan2(1.0, 0.0);
        double r63603 = r63601 * r63602;
        double r63604 = u2;
        double r63605 = r63603 * r63604;
        double r63606 = cos(r63605);
        double r63607 = r63600 * r63606;
        double r63608 = r63607 + r63598;
        return r63608;
}

double f(double u1, double u2) {
        double r63609 = 0.16666666666666666;
        double r63610 = -1.0;
        double r63611 = 1.0;
        double r63612 = pow(r63610, r63611);
        double r63613 = -2.0;
        double r63614 = pow(r63613, r63611);
        double r63615 = 1.0;
        double r63616 = u1;
        double r63617 = r63615 / r63616;
        double r63618 = log(r63617);
        double r63619 = pow(r63618, r63611);
        double r63620 = r63614 * r63619;
        double r63621 = r63612 * r63620;
        double r63622 = 0.5;
        double r63623 = pow(r63621, r63622);
        double r63624 = 2.0;
        double r63625 = u2;
        double r63626 = atan2(1.0, 0.0);
        double r63627 = r63625 * r63626;
        double r63628 = r63624 * r63627;
        double r63629 = cos(r63628);
        double r63630 = r63623 * r63629;
        double r63631 = fma(r63609, r63630, r63622);
        return r63631;
}

Error

Bits error versus u1

Bits error versus u2

Derivation

  1. Initial program 0.4

    \[\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\]
  2. Simplified0.4

    \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{1}{6} \cdot {\left(-2 \cdot \log u1\right)}^{0.5}, \cos \left(\left(2 \cdot \pi\right) \cdot u2\right), 0.5\right)}\]
  3. Taylor expanded around inf 0.4

    \[\leadsto \color{blue}{0.1666666666666666574148081281236954964697 \cdot \left({\left({-1}^{1} \cdot \left({-2}^{1} \cdot {\left(\log \left(\frac{1}{u1}\right)\right)}^{1}\right)\right)}^{0.5} \cdot \cos \left(2 \cdot \left(u2 \cdot \pi\right)\right)\right) + 0.5}\]
  4. Simplified0.4

    \[\leadsto \color{blue}{\mathsf{fma}\left(0.1666666666666666574148081281236954964697, {\left({-1}^{1} \cdot \left({-2}^{1} \cdot {\left(\log \left(\frac{1}{u1}\right)\right)}^{1}\right)\right)}^{0.5} \cdot \cos \left(2 \cdot \left(u2 \cdot \pi\right)\right), 0.5\right)}\]
  5. Final simplification0.4

    \[\leadsto \mathsf{fma}\left(0.1666666666666666574148081281236954964697, {\left({-1}^{1} \cdot \left({-2}^{1} \cdot {\left(\log \left(\frac{1}{u1}\right)\right)}^{1}\right)\right)}^{0.5} \cdot \cos \left(2 \cdot \left(u2 \cdot \pi\right)\right), 0.5\right)\]

Reproduce

herbie shell --seed 2019354 +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))