Average Error: 0.4 → 0.4
Time: 2.7m
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(\left(\frac{1}{6} \cdot \cos \left(2 \cdot \left(u2 \cdot \pi\right)\right)\right), \left({\left(\left({\left(-\log u1\right)}^{1.0} \cdot {-2}^{1.0}\right) \cdot {-1}^{1.0}\right)}^{0.5}\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(\left(\frac{1}{6} \cdot \cos \left(2 \cdot \left(u2 \cdot \pi\right)\right)\right), \left({\left(\left({\left(-\log u1\right)}^{1.0} \cdot {-2}^{1.0}\right) \cdot {-1}^{1.0}\right)}^{0.5}\right), 0.5\right)
double f(double u1, double u2) {
        double r16580274 = 1.0;
        double r16580275 = 6.0;
        double r16580276 = r16580274 / r16580275;
        double r16580277 = -2.0;
        double r16580278 = u1;
        double r16580279 = log(r16580278);
        double r16580280 = r16580277 * r16580279;
        double r16580281 = 0.5;
        double r16580282 = pow(r16580280, r16580281);
        double r16580283 = r16580276 * r16580282;
        double r16580284 = 2.0;
        double r16580285 = atan2(1.0, 0.0);
        double r16580286 = r16580284 * r16580285;
        double r16580287 = u2;
        double r16580288 = r16580286 * r16580287;
        double r16580289 = cos(r16580288);
        double r16580290 = r16580283 * r16580289;
        double r16580291 = r16580290 + r16580281;
        return r16580291;
}

double f(double u1, double u2) {
        double r16580292 = 0.16666666666666666;
        double r16580293 = 2.0;
        double r16580294 = u2;
        double r16580295 = atan2(1.0, 0.0);
        double r16580296 = r16580294 * r16580295;
        double r16580297 = r16580293 * r16580296;
        double r16580298 = cos(r16580297);
        double r16580299 = r16580292 * r16580298;
        double r16580300 = u1;
        double r16580301 = log(r16580300);
        double r16580302 = -r16580301;
        double r16580303 = 1.0;
        double r16580304 = pow(r16580302, r16580303);
        double r16580305 = -2.0;
        double r16580306 = pow(r16580305, r16580303);
        double r16580307 = r16580304 * r16580306;
        double r16580308 = -1.0;
        double r16580309 = pow(r16580308, r16580303);
        double r16580310 = r16580307 * r16580309;
        double r16580311 = 0.5;
        double r16580312 = pow(r16580310, r16580311);
        double r16580313 = fma(r16580299, r16580312, r16580311);
        return r16580313;
}

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

    \[\leadsto \color{blue}{\frac{1}{6} \cdot \left(\cos \left(2 \cdot \left(u2 \cdot \pi\right)\right) \cdot {\left({-1}^{1.0} \cdot \left({-2}^{1.0} \cdot {\left(\log \left(\frac{1}{u1}\right)\right)}^{1.0}\right)\right)}^{0.5}\right) + 0.5}\]
  4. Simplified0.4

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

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

Reproduce

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