Average Error: 0.4 → 0.4
Time: 10.4s
Precision: 64
\[0.0 \le u1 \le 1 \land 0.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(1 \cdot \left(\frac{1}{6} \cdot {\left(-2 \cdot \log u1\right)}^{0.5}\right), \cos \left(\left(2 \cdot \pi\right) \cdot u2\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(1 \cdot \left(\frac{1}{6} \cdot {\left(-2 \cdot \log u1\right)}^{0.5}\right), \cos \left(\left(2 \cdot \pi\right) \cdot u2\right), 0.5\right)
double f(double u1, double u2) {
        double r64447 = 1.0;
        double r64448 = 6.0;
        double r64449 = r64447 / r64448;
        double r64450 = -2.0;
        double r64451 = u1;
        double r64452 = log(r64451);
        double r64453 = r64450 * r64452;
        double r64454 = 0.5;
        double r64455 = pow(r64453, r64454);
        double r64456 = r64449 * r64455;
        double r64457 = 2.0;
        double r64458 = atan2(1.0, 0.0);
        double r64459 = r64457 * r64458;
        double r64460 = u2;
        double r64461 = r64459 * r64460;
        double r64462 = cos(r64461);
        double r64463 = r64456 * r64462;
        double r64464 = r64463 + r64454;
        return r64464;
}

double f(double u1, double u2) {
        double r64465 = 1.0;
        double r64466 = 1.0;
        double r64467 = 6.0;
        double r64468 = r64466 / r64467;
        double r64469 = -2.0;
        double r64470 = u1;
        double r64471 = log(r64470);
        double r64472 = r64469 * r64471;
        double r64473 = 0.5;
        double r64474 = pow(r64472, r64473);
        double r64475 = r64468 * r64474;
        double r64476 = r64465 * r64475;
        double r64477 = 2.0;
        double r64478 = atan2(1.0, 0.0);
        double r64479 = r64477 * r64478;
        double r64480 = u2;
        double r64481 = r64479 * r64480;
        double r64482 = cos(r64481);
        double r64483 = fma(r64476, r64482, r64473);
        return r64483;
}

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

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

    \[\leadsto \mathsf{fma}\left(\color{blue}{\sqrt{\frac{1}{6}} \cdot \left(\sqrt{\frac{1}{6}} \cdot {\left(-2 \cdot \log u1\right)}^{0.5}\right)}, \cos \left(\left(2 \cdot \pi\right) \cdot u2\right), 0.5\right)\]
  6. Using strategy rm
  7. Applied *-un-lft-identity0.4

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

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

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

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

Reproduce

herbie shell --seed 2020049 +o rules:numerics
(FPCore (u1 u2)
  :name "normal distribution"
  :precision binary64
  :pre (and (<= 0.0 u1 1) (<= 0.0 u2 1))
  (+ (* (* (/ 1 6) (pow (* -2 (log u1)) 0.5)) (cos (* (* 2 PI) u2))) 0.5))