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\]
\[\left(\frac{1}{6} \cdot \left(1 \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(\frac{1}{6} \cdot \left(1 \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 r61086 = 1.0;
        double r61087 = 6.0;
        double r61088 = r61086 / r61087;
        double r61089 = -2.0;
        double r61090 = u1;
        double r61091 = log(r61090);
        double r61092 = r61089 * r61091;
        double r61093 = 0.5;
        double r61094 = pow(r61092, r61093);
        double r61095 = r61088 * r61094;
        double r61096 = 2.0;
        double r61097 = atan2(1.0, 0.0);
        double r61098 = r61096 * r61097;
        double r61099 = u2;
        double r61100 = r61098 * r61099;
        double r61101 = cos(r61100);
        double r61102 = r61095 * r61101;
        double r61103 = r61102 + r61093;
        return r61103;
}

double f(double u1, double u2) {
        double r61104 = 1.0;
        double r61105 = 6.0;
        double r61106 = r61104 / r61105;
        double r61107 = 1.0;
        double r61108 = -2.0;
        double r61109 = u1;
        double r61110 = log(r61109);
        double r61111 = r61108 * r61110;
        double r61112 = 0.5;
        double r61113 = pow(r61111, r61112);
        double r61114 = r61107 * r61113;
        double r61115 = r61106 * r61114;
        double r61116 = 2.0;
        double r61117 = atan2(1.0, 0.0);
        double r61118 = r61116 * r61117;
        double r61119 = u2;
        double r61120 = r61118 * r61119;
        double r61121 = cos(r61120);
        double r61122 = r61115 * r61121;
        double r61123 = r61122 + r61112;
        return r61123;
}

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 *-un-lft-identity0.4

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

    \[\leadsto \left(\frac{1}{6} \cdot \left(1 \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 2020089 +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))