Average Error: 0.4 → 0.4
Time: 31.2s
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(\sqrt{\frac{1}{6}} \cdot \left(\sqrt{\frac{1}{6}} \cdot {\left(-2 \cdot \log u1\right)}^{0.5}\right), \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(\sqrt{\frac{1}{6}} \cdot \left(\sqrt{\frac{1}{6}} \cdot {\left(-2 \cdot \log u1\right)}^{0.5}\right), \cos \left(\left(2 \cdot \pi\right) \cdot u2\right), 0.5\right)
double f(double u1, double u2) {
        double r78538 = 1.0;
        double r78539 = 6.0;
        double r78540 = r78538 / r78539;
        double r78541 = -2.0;
        double r78542 = u1;
        double r78543 = log(r78542);
        double r78544 = r78541 * r78543;
        double r78545 = 0.5;
        double r78546 = pow(r78544, r78545);
        double r78547 = r78540 * r78546;
        double r78548 = 2.0;
        double r78549 = atan2(1.0, 0.0);
        double r78550 = r78548 * r78549;
        double r78551 = u2;
        double r78552 = r78550 * r78551;
        double r78553 = cos(r78552);
        double r78554 = r78547 * r78553;
        double r78555 = r78554 + r78545;
        return r78555;
}

double f(double u1, double u2) {
        double r78556 = 1.0;
        double r78557 = 6.0;
        double r78558 = r78556 / r78557;
        double r78559 = sqrt(r78558);
        double r78560 = -2.0;
        double r78561 = u1;
        double r78562 = log(r78561);
        double r78563 = r78560 * r78562;
        double r78564 = 0.5;
        double r78565 = pow(r78563, r78564);
        double r78566 = r78559 * r78565;
        double r78567 = r78559 * r78566;
        double r78568 = 2.0;
        double r78569 = atan2(1.0, 0.0);
        double r78570 = r78568 * r78569;
        double r78571 = u2;
        double r78572 = r78570 * r78571;
        double r78573 = cos(r78572);
        double r78574 = fma(r78567, r78573, r78564);
        return r78574;
}

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 add-sqr-sqrt0.4

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

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

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

Reproduce

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