Average Error: 0.4 → 0.3
Time: 14.8s
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(\frac{1 \cdot {\left(-2 \cdot \log u1\right)}^{0.5}}{6}, \cos \left(\left(2 \cdot \pi\right) \cdot u2\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(\frac{1 \cdot {\left(-2 \cdot \log u1\right)}^{0.5}}{6}, \cos \left(\left(2 \cdot \pi\right) \cdot u2\right), 0.5\right)
double f(double u1, double u2) {
        double r70602 = 1.0;
        double r70603 = 6.0;
        double r70604 = r70602 / r70603;
        double r70605 = -2.0;
        double r70606 = u1;
        double r70607 = log(r70606);
        double r70608 = r70605 * r70607;
        double r70609 = 0.5;
        double r70610 = pow(r70608, r70609);
        double r70611 = r70604 * r70610;
        double r70612 = 2.0;
        double r70613 = atan2(1.0, 0.0);
        double r70614 = r70612 * r70613;
        double r70615 = u2;
        double r70616 = r70614 * r70615;
        double r70617 = cos(r70616);
        double r70618 = r70611 * r70617;
        double r70619 = r70618 + r70609;
        return r70619;
}

double f(double u1, double u2) {
        double r70620 = 1.0;
        double r70621 = -2.0;
        double r70622 = u1;
        double r70623 = log(r70622);
        double r70624 = r70621 * r70623;
        double r70625 = 0.5;
        double r70626 = pow(r70624, r70625);
        double r70627 = r70620 * r70626;
        double r70628 = 6.0;
        double r70629 = r70627 / r70628;
        double r70630 = 2.0;
        double r70631 = atan2(1.0, 0.0);
        double r70632 = r70630 * r70631;
        double r70633 = u2;
        double r70634 = r70632 * r70633;
        double r70635 = cos(r70634);
        double r70636 = fma(r70629, r70635, r70625);
        return r70636;
}

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. Using strategy rm
  4. Applied associate-*l/0.3

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

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

Reproduce

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))