Average Error: 0.4 → 0.3
Time: 35.7s
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), \left(\sqrt{\frac{1}{6}} \cdot {\left(-2 \cdot \log u1\right)}^{0.5}\right) \cdot \sqrt{\frac{1}{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), \left(\sqrt{\frac{1}{6}} \cdot {\left(-2 \cdot \log u1\right)}^{0.5}\right) \cdot \sqrt{\frac{1}{6}}, 0.5\right)
double f(double u1, double u2) {
        double r1388271 = 1.0;
        double r1388272 = 6.0;
        double r1388273 = r1388271 / r1388272;
        double r1388274 = -2.0;
        double r1388275 = u1;
        double r1388276 = log(r1388275);
        double r1388277 = r1388274 * r1388276;
        double r1388278 = 0.5;
        double r1388279 = pow(r1388277, r1388278);
        double r1388280 = r1388273 * r1388279;
        double r1388281 = 2.0;
        double r1388282 = atan2(1.0, 0.0);
        double r1388283 = r1388281 * r1388282;
        double r1388284 = u2;
        double r1388285 = r1388283 * r1388284;
        double r1388286 = cos(r1388285);
        double r1388287 = r1388280 * r1388286;
        double r1388288 = r1388287 + r1388278;
        return r1388288;
}

double f(double u1, double u2) {
        double r1388289 = atan2(1.0, 0.0);
        double r1388290 = 2.0;
        double r1388291 = r1388289 * r1388290;
        double r1388292 = u2;
        double r1388293 = r1388291 * r1388292;
        double r1388294 = cos(r1388293);
        double r1388295 = 0.16666666666666666;
        double r1388296 = sqrt(r1388295);
        double r1388297 = -2.0;
        double r1388298 = u1;
        double r1388299 = log(r1388298);
        double r1388300 = r1388297 * r1388299;
        double r1388301 = 0.5;
        double r1388302 = pow(r1388300, r1388301);
        double r1388303 = r1388296 * r1388302;
        double r1388304 = r1388303 * r1388296;
        double r1388305 = fma(r1388294, r1388304, r1388301);
        return r1388305;
}

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(u2 \cdot \left(2 \cdot \pi\right)\right), \frac{1}{6} \cdot {\left(-2 \cdot \log u1\right)}^{0.5}, 0.5\right)}\]
  3. Using strategy rm
  4. Applied add-sqr-sqrt0.4

    \[\leadsto \mathsf{fma}\left(\cos \left(u2 \cdot \left(2 \cdot \pi\right)\right), \color{blue}{\left(\sqrt{\frac{1}{6}} \cdot \sqrt{\frac{1}{6}}\right)} \cdot {\left(-2 \cdot \log u1\right)}^{0.5}, 0.5\right)\]
  5. Applied associate-*l*0.3

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

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

Reproduce

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