Average Error: 0.4 → 0.3
Time: 2.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(\frac{{\left(-2 \cdot \log u1\right)}^{0.5}}{6}\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(\frac{{\left(-2 \cdot \log u1\right)}^{0.5}}{6}\right) + 0.5)_*
double f(double u1, double u2) {
        double r11133231 = 1.0;
        double r11133232 = 6.0;
        double r11133233 = r11133231 / r11133232;
        double r11133234 = -2.0;
        double r11133235 = u1;
        double r11133236 = log(r11133235);
        double r11133237 = r11133234 * r11133236;
        double r11133238 = 0.5;
        double r11133239 = pow(r11133237, r11133238);
        double r11133240 = r11133233 * r11133239;
        double r11133241 = 2.0;
        double r11133242 = atan2(1.0, 0.0);
        double r11133243 = r11133241 * r11133242;
        double r11133244 = u2;
        double r11133245 = r11133243 * r11133244;
        double r11133246 = cos(r11133245);
        double r11133247 = r11133240 * r11133246;
        double r11133248 = r11133247 + r11133238;
        return r11133248;
}

double f(double u1, double u2) {
        double r11133249 = atan2(1.0, 0.0);
        double r11133250 = 2.0;
        double r11133251 = r11133249 * r11133250;
        double r11133252 = u2;
        double r11133253 = r11133251 * r11133252;
        double r11133254 = cos(r11133253);
        double r11133255 = -2.0;
        double r11133256 = u1;
        double r11133257 = log(r11133256);
        double r11133258 = r11133255 * r11133257;
        double r11133259 = 0.5;
        double r11133260 = pow(r11133258, r11133259);
        double r11133261 = 6.0;
        double r11133262 = r11133260 / r11133261;
        double r11133263 = fma(r11133254, r11133262, r11133259);
        return r11133263;
}

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. Final simplification0.3

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

Reproduce

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