Average Error: 0.4 → 0.3
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\]
\[\left(\sqrt{\frac{1}{6}} \cdot \left(\sqrt{\frac{1}{6}} \cdot {\left(-2 \cdot \log u1\right)}^{0.5}\right)\right) \cdot \cos \left(\left(2 \cdot \pi\right) \cdot u2\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(\sqrt{\frac{1}{6}} \cdot \left(\sqrt{\frac{1}{6}} \cdot {\left(-2 \cdot \log u1\right)}^{0.5}\right)\right) \cdot \cos \left(\left(2 \cdot \pi\right) \cdot u2\right) + 0.5
double f(double u1, double u2) {
        double r63634 = 1.0;
        double r63635 = 6.0;
        double r63636 = r63634 / r63635;
        double r63637 = -2.0;
        double r63638 = u1;
        double r63639 = log(r63638);
        double r63640 = r63637 * r63639;
        double r63641 = 0.5;
        double r63642 = pow(r63640, r63641);
        double r63643 = r63636 * r63642;
        double r63644 = 2.0;
        double r63645 = atan2(1.0, 0.0);
        double r63646 = r63644 * r63645;
        double r63647 = u2;
        double r63648 = r63646 * r63647;
        double r63649 = cos(r63648);
        double r63650 = r63643 * r63649;
        double r63651 = r63650 + r63641;
        return r63651;
}

double f(double u1, double u2) {
        double r63652 = 1.0;
        double r63653 = 6.0;
        double r63654 = r63652 / r63653;
        double r63655 = sqrt(r63654);
        double r63656 = -2.0;
        double r63657 = u1;
        double r63658 = log(r63657);
        double r63659 = r63656 * r63658;
        double r63660 = 0.5;
        double r63661 = pow(r63659, r63660);
        double r63662 = r63655 * r63661;
        double r63663 = r63655 * r63662;
        double r63664 = 2.0;
        double r63665 = atan2(1.0, 0.0);
        double r63666 = r63664 * r63665;
        double r63667 = u2;
        double r63668 = r63666 * r63667;
        double r63669 = cos(r63668);
        double r63670 = r63663 * r63669;
        double r63671 = r63670 + r63660;
        return r63671;
}

Error

Bits error versus u1

Bits error versus u2

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

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. Using strategy rm
  3. Applied add-sqr-sqrt0.4

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

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

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

Reproduce

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