Average Error: 0.4 → 0.3
Time: 33.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{log1p}\left(\mathsf{expm1}\left(\mathsf{fma}\left(\cos \left(\left(u2 \cdot \pi\right) \cdot 2\right), \frac{{\left(\log u1 \cdot -2\right)}^{0.5} \cdot 1}{6}, 0.5\right)\right)\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{log1p}\left(\mathsf{expm1}\left(\mathsf{fma}\left(\cos \left(\left(u2 \cdot \pi\right) \cdot 2\right), \frac{{\left(\log u1 \cdot -2\right)}^{0.5} \cdot 1}{6}, 0.5\right)\right)\right)
double f(double u1, double u2) {
        double r2701597 = 1.0;
        double r2701598 = 6.0;
        double r2701599 = r2701597 / r2701598;
        double r2701600 = -2.0;
        double r2701601 = u1;
        double r2701602 = log(r2701601);
        double r2701603 = r2701600 * r2701602;
        double r2701604 = 0.5;
        double r2701605 = pow(r2701603, r2701604);
        double r2701606 = r2701599 * r2701605;
        double r2701607 = 2.0;
        double r2701608 = atan2(1.0, 0.0);
        double r2701609 = r2701607 * r2701608;
        double r2701610 = u2;
        double r2701611 = r2701609 * r2701610;
        double r2701612 = cos(r2701611);
        double r2701613 = r2701606 * r2701612;
        double r2701614 = r2701613 + r2701604;
        return r2701614;
}

double f(double u1, double u2) {
        double r2701615 = u2;
        double r2701616 = atan2(1.0, 0.0);
        double r2701617 = r2701615 * r2701616;
        double r2701618 = 2.0;
        double r2701619 = r2701617 * r2701618;
        double r2701620 = cos(r2701619);
        double r2701621 = u1;
        double r2701622 = log(r2701621);
        double r2701623 = -2.0;
        double r2701624 = r2701622 * r2701623;
        double r2701625 = 0.5;
        double r2701626 = pow(r2701624, r2701625);
        double r2701627 = 1.0;
        double r2701628 = r2701626 * r2701627;
        double r2701629 = 6.0;
        double r2701630 = r2701628 / r2701629;
        double r2701631 = fma(r2701620, r2701630, r2701625);
        double r2701632 = expm1(r2701631);
        double r2701633 = log1p(r2701632);
        return r2701633;
}

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 associate-*l/0.3

    \[\leadsto \mathsf{fma}\left(\cos \left(2 \cdot \left(\pi \cdot u2\right)\right), \color{blue}{\frac{1 \cdot {\left(-2 \cdot \log u1\right)}^{0.5}}{6}}, 0.5\right)\]
  5. Using strategy rm
  6. Applied log1p-expm1-u0.3

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

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

Reproduce

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