Average Error: 0.4 → 0.3
Time: 1.2m
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\]
\[(\left(\cos \left(\left(\pi \cdot 2\right) \cdot u2\right)\right) \cdot \left(\log_* (1 + (e^{\frac{{\left(-2 \cdot \log u1\right)}^{0.5}}{6}} - 1)^*)\right) + 0.5)_*\]
\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
(\left(\cos \left(\left(\pi \cdot 2\right) \cdot u2\right)\right) \cdot \left(\log_* (1 + (e^{\frac{{\left(-2 \cdot \log u1\right)}^{0.5}}{6}} - 1)^*)\right) + 0.5)_*
double f(double u1, double u2) {
        double r5096496 = 1.0;
        double r5096497 = 6.0;
        double r5096498 = r5096496 / r5096497;
        double r5096499 = -2.0;
        double r5096500 = u1;
        double r5096501 = log(r5096500);
        double r5096502 = r5096499 * r5096501;
        double r5096503 = 0.5;
        double r5096504 = pow(r5096502, r5096503);
        double r5096505 = r5096498 * r5096504;
        double r5096506 = 2.0;
        double r5096507 = atan2(1.0, 0.0);
        double r5096508 = r5096506 * r5096507;
        double r5096509 = u2;
        double r5096510 = r5096508 * r5096509;
        double r5096511 = cos(r5096510);
        double r5096512 = r5096505 * r5096511;
        double r5096513 = r5096512 + r5096503;
        return r5096513;
}

double f(double u1, double u2) {
        double r5096514 = atan2(1.0, 0.0);
        double r5096515 = 2.0;
        double r5096516 = r5096514 * r5096515;
        double r5096517 = u2;
        double r5096518 = r5096516 * r5096517;
        double r5096519 = cos(r5096518);
        double r5096520 = -2.0;
        double r5096521 = u1;
        double r5096522 = log(r5096521);
        double r5096523 = r5096520 * r5096522;
        double r5096524 = 0.5;
        double r5096525 = pow(r5096523, r5096524);
        double r5096526 = 6.0;
        double r5096527 = r5096525 / r5096526;
        double r5096528 = expm1(r5096527);
        double r5096529 = log1p(r5096528);
        double r5096530 = fma(r5096519, r5096529, r5096524);
        return r5096530;
}

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}{(\left(\cos \left(u2 \cdot \left(2 \cdot \pi\right)\right)\right) \cdot \left(\frac{{\left(-2 \cdot \log u1\right)}^{0.5}}{6}\right) + 0.5)_*}\]
  3. Using strategy rm
  4. Applied log1p-expm1-u0.3

    \[\leadsto (\left(\cos \left(u2 \cdot \left(2 \cdot \pi\right)\right)\right) \cdot \color{blue}{\left(\log_* (1 + (e^{\frac{{\left(-2 \cdot \log u1\right)}^{0.5}}{6}} - 1)^*)\right)} + 0.5)_*\]
  5. Final simplification0.3

    \[\leadsto (\left(\cos \left(\left(\pi \cdot 2\right) \cdot u2\right)\right) \cdot \left(\log_* (1 + (e^{\frac{{\left(-2 \cdot \log u1\right)}^{0.5}}{6}} - 1)^*)\right) + 0.5)_*\]

Reproduce

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