Average Error: 0.4 → 0.3
Time: 39.7s
Precision: 64
\[0 \le u1 \le 1 \land 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(\left(\cos \left(\left(\pi \cdot 2\right) \cdot u2\right)\right), \left(\frac{{\left(-2 \cdot \log u1\right)}^{0.5}}{6}\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(\left(\cos \left(\left(\pi \cdot 2\right) \cdot u2\right)\right), \left(\frac{{\left(-2 \cdot \log u1\right)}^{0.5}}{6}\right), 0.5\right)
double f(double u1, double u2) {
        double r1282535 = 1.0;
        double r1282536 = 6.0;
        double r1282537 = r1282535 / r1282536;
        double r1282538 = -2.0;
        double r1282539 = u1;
        double r1282540 = log(r1282539);
        double r1282541 = r1282538 * r1282540;
        double r1282542 = 0.5;
        double r1282543 = pow(r1282541, r1282542);
        double r1282544 = r1282537 * r1282543;
        double r1282545 = 2.0;
        double r1282546 = atan2(1.0, 0.0);
        double r1282547 = r1282545 * r1282546;
        double r1282548 = u2;
        double r1282549 = r1282547 * r1282548;
        double r1282550 = cos(r1282549);
        double r1282551 = r1282544 * r1282550;
        double r1282552 = r1282551 + r1282542;
        return r1282552;
}

double f(double u1, double u2) {
        double r1282553 = atan2(1.0, 0.0);
        double r1282554 = 2.0;
        double r1282555 = r1282553 * r1282554;
        double r1282556 = u2;
        double r1282557 = r1282555 * r1282556;
        double r1282558 = cos(r1282557);
        double r1282559 = -2.0;
        double r1282560 = u1;
        double r1282561 = log(r1282560);
        double r1282562 = r1282559 * r1282561;
        double r1282563 = 0.5;
        double r1282564 = pow(r1282562, r1282563);
        double r1282565 = 6.0;
        double r1282566 = r1282564 / r1282565;
        double r1282567 = fma(r1282558, r1282566, r1282563);
        return r1282567;
}

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.3

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

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

Reproduce

herbie shell --seed 2019132 +o rules:numerics
(FPCore (u1 u2)
  :name "normal distribution"
  :pre (and (<= 0 u1 1) (<= 0 u2 1))
  (+ (* (* (/ 1 6) (pow (* -2 (log u1)) 0.5)) (cos (* (* 2 PI) u2))) 0.5))