Average Error: 0.4 → 0.3
Time: 48.3s
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\]
\[\frac{\left(\cos \left(\left(u2 \cdot 2\right) \cdot \pi\right) \cdot 1\right) \cdot {\left(\log u1 \cdot -2\right)}^{0.5}}{6} + 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
\frac{\left(\cos \left(\left(u2 \cdot 2\right) \cdot \pi\right) \cdot 1\right) \cdot {\left(\log u1 \cdot -2\right)}^{0.5}}{6} + 0.5
double f(double u1, double u2) {
        double r2713946 = 1.0;
        double r2713947 = 6.0;
        double r2713948 = r2713946 / r2713947;
        double r2713949 = -2.0;
        double r2713950 = u1;
        double r2713951 = log(r2713950);
        double r2713952 = r2713949 * r2713951;
        double r2713953 = 0.5;
        double r2713954 = pow(r2713952, r2713953);
        double r2713955 = r2713948 * r2713954;
        double r2713956 = 2.0;
        double r2713957 = atan2(1.0, 0.0);
        double r2713958 = r2713956 * r2713957;
        double r2713959 = u2;
        double r2713960 = r2713958 * r2713959;
        double r2713961 = cos(r2713960);
        double r2713962 = r2713955 * r2713961;
        double r2713963 = r2713962 + r2713953;
        return r2713963;
}

double f(double u1, double u2) {
        double r2713964 = u2;
        double r2713965 = 2.0;
        double r2713966 = r2713964 * r2713965;
        double r2713967 = atan2(1.0, 0.0);
        double r2713968 = r2713966 * r2713967;
        double r2713969 = cos(r2713968);
        double r2713970 = 1.0;
        double r2713971 = r2713969 * r2713970;
        double r2713972 = u1;
        double r2713973 = log(r2713972);
        double r2713974 = -2.0;
        double r2713975 = r2713973 * r2713974;
        double r2713976 = 0.5;
        double r2713977 = pow(r2713975, r2713976);
        double r2713978 = r2713971 * r2713977;
        double r2713979 = 6.0;
        double r2713980 = r2713978 / r2713979;
        double r2713981 = r2713980 + r2713976;
        return r2713981;
}

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. Simplified0.4

    \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{1}{6}, \cos \left(u2 \cdot \left(\pi \cdot 2\right)\right) \cdot {\left(-2 \cdot \log u1\right)}^{0.5}, 0.5\right)}\]
  3. Using strategy rm
  4. Applied sqr-pow0.6

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

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

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

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

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

Reproduce

herbie shell --seed 2019200 +o rules:numerics
(FPCore (u1 u2)
  :name "normal distribution"
  :pre (and (<= 0.0 u1 1.0) (<= 0.0 u2 1.0))
  (+ (* (* (/ 1.0 6.0) (pow (* -2.0 (log u1)) 0.5)) (cos (* (* 2.0 PI) u2))) 0.5))