Average Error: 0.4 → 0.4
Time: 13.2s
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(0.166666666666666657, {\left({-1}^{1} \cdot \left({-2}^{1} \cdot {\left(\log \left(\frac{1}{u1}\right)\right)}^{1}\right)\right)}^{0.5} \cdot \cos \left(2 \cdot \left(u2 \cdot \pi\right)\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(0.166666666666666657, {\left({-1}^{1} \cdot \left({-2}^{1} \cdot {\left(\log \left(\frac{1}{u1}\right)\right)}^{1}\right)\right)}^{0.5} \cdot \cos \left(2 \cdot \left(u2 \cdot \pi\right)\right), 0.5\right)
double f(double u1, double u2) {
        double r76085 = 1.0;
        double r76086 = 6.0;
        double r76087 = r76085 / r76086;
        double r76088 = -2.0;
        double r76089 = u1;
        double r76090 = log(r76089);
        double r76091 = r76088 * r76090;
        double r76092 = 0.5;
        double r76093 = pow(r76091, r76092);
        double r76094 = r76087 * r76093;
        double r76095 = 2.0;
        double r76096 = atan2(1.0, 0.0);
        double r76097 = r76095 * r76096;
        double r76098 = u2;
        double r76099 = r76097 * r76098;
        double r76100 = cos(r76099);
        double r76101 = r76094 * r76100;
        double r76102 = r76101 + r76092;
        return r76102;
}

double f(double u1, double u2) {
        double r76103 = 0.16666666666666666;
        double r76104 = -1.0;
        double r76105 = 1.0;
        double r76106 = pow(r76104, r76105);
        double r76107 = -2.0;
        double r76108 = pow(r76107, r76105);
        double r76109 = 1.0;
        double r76110 = u1;
        double r76111 = r76109 / r76110;
        double r76112 = log(r76111);
        double r76113 = pow(r76112, r76105);
        double r76114 = r76108 * r76113;
        double r76115 = r76106 * r76114;
        double r76116 = 0.5;
        double r76117 = pow(r76115, r76116);
        double r76118 = 2.0;
        double r76119 = u2;
        double r76120 = atan2(1.0, 0.0);
        double r76121 = r76119 * r76120;
        double r76122 = r76118 * r76121;
        double r76123 = cos(r76122);
        double r76124 = r76117 * r76123;
        double r76125 = fma(r76103, r76124, r76116);
        return r76125;
}

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. Taylor expanded around inf 0.4

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

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

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

Reproduce

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