Average Error: 0.4 → 0.3
Time: 2.0m
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(\cos \left(\left(\pi \cdot 2\right) \cdot u2\right), \frac{{\left(-2 \cdot \log u1\right)}^{0.5}}{6}, 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(\pi \cdot 2\right) \cdot u2\right), \frac{{\left(-2 \cdot \log u1\right)}^{0.5}}{6}, 0.5\right)
double f(double u1, double u2) {
        double r5330780 = 1.0;
        double r5330781 = 6.0;
        double r5330782 = r5330780 / r5330781;
        double r5330783 = -2.0;
        double r5330784 = u1;
        double r5330785 = log(r5330784);
        double r5330786 = r5330783 * r5330785;
        double r5330787 = 0.5;
        double r5330788 = pow(r5330786, r5330787);
        double r5330789 = r5330782 * r5330788;
        double r5330790 = 2.0;
        double r5330791 = atan2(1.0, 0.0);
        double r5330792 = r5330790 * r5330791;
        double r5330793 = u2;
        double r5330794 = r5330792 * r5330793;
        double r5330795 = cos(r5330794);
        double r5330796 = r5330789 * r5330795;
        double r5330797 = r5330796 + r5330787;
        return r5330797;
}

double f(double u1, double u2) {
        double r5330798 = atan2(1.0, 0.0);
        double r5330799 = 2.0;
        double r5330800 = r5330798 * r5330799;
        double r5330801 = u2;
        double r5330802 = r5330800 * r5330801;
        double r5330803 = cos(r5330802);
        double r5330804 = -2.0;
        double r5330805 = u1;
        double r5330806 = log(r5330805);
        double r5330807 = r5330804 * r5330806;
        double r5330808 = 0.5;
        double r5330809 = pow(r5330807, r5330808);
        double r5330810 = 6.0;
        double r5330811 = r5330809 / r5330810;
        double r5330812 = fma(r5330803, r5330811, r5330808);
        return r5330812;
}

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(\cos \left(u2 \cdot \left(2 \cdot \pi\right)\right), \frac{{\left(-2 \cdot \log u1\right)}^{0.5}}{6}, 0.5\right)}\]
  3. Final simplification0.3

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

Reproduce

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