Average Error: 0.4 → 0.3
Time: 55.3s
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(\cos \left(\left(u2 \cdot \pi\right) \cdot 2\right), \frac{{\left(\log u1 \cdot -2\right)}^{0.5}}{6} \cdot 1, 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(\cos \left(\left(u2 \cdot \pi\right) \cdot 2\right), \frac{{\left(\log u1 \cdot -2\right)}^{0.5}}{6} \cdot 1, 0.5\right)
double f(double u1, double u2) {
        double r1831354 = 1.0;
        double r1831355 = 6.0;
        double r1831356 = r1831354 / r1831355;
        double r1831357 = -2.0;
        double r1831358 = u1;
        double r1831359 = log(r1831358);
        double r1831360 = r1831357 * r1831359;
        double r1831361 = 0.5;
        double r1831362 = pow(r1831360, r1831361);
        double r1831363 = r1831356 * r1831362;
        double r1831364 = 2.0;
        double r1831365 = atan2(1.0, 0.0);
        double r1831366 = r1831364 * r1831365;
        double r1831367 = u2;
        double r1831368 = r1831366 * r1831367;
        double r1831369 = cos(r1831368);
        double r1831370 = r1831363 * r1831369;
        double r1831371 = r1831370 + r1831361;
        return r1831371;
}

double f(double u1, double u2) {
        double r1831372 = u2;
        double r1831373 = atan2(1.0, 0.0);
        double r1831374 = r1831372 * r1831373;
        double r1831375 = 2.0;
        double r1831376 = r1831374 * r1831375;
        double r1831377 = cos(r1831376);
        double r1831378 = u1;
        double r1831379 = log(r1831378);
        double r1831380 = -2.0;
        double r1831381 = r1831379 * r1831380;
        double r1831382 = 0.5;
        double r1831383 = pow(r1831381, r1831382);
        double r1831384 = 6.0;
        double r1831385 = r1831383 / r1831384;
        double r1831386 = 1.0;
        double r1831387 = r1831385 * r1831386;
        double r1831388 = fma(r1831377, r1831387, r1831382);
        return r1831388;
}

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(\cos \left(2 \cdot \left(\pi \cdot u2\right)\right), \frac{1}{6} \cdot {\left(-2 \cdot \log u1\right)}^{0.5}, 0.5\right)}\]
  3. Using strategy rm
  4. Applied div-inv0.4

    \[\leadsto \mathsf{fma}\left(\cos \left(2 \cdot \left(\pi \cdot u2\right)\right), \color{blue}{\left(1 \cdot \frac{1}{6}\right)} \cdot {\left(-2 \cdot \log u1\right)}^{0.5}, 0.5\right)\]
  5. Applied associate-*l*0.4

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

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

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

Reproduce

herbie shell --seed 2019168 +o rules:numerics
(FPCore (u1 u2)
  :name "normal distribution"
  :pre (and (<= 0.0 u1 1.0) (<= 0.0 u2 1.0))
  (+ (* (* (/ 1.0 6.0) (pow (* -2.0 (log u1)) 0.5)) (cos (* (* 2.0 PI) u2))) 0.5))