Average Error: 0.4 → 0.3
Time: 12.1s
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(\frac{1 \cdot {\left(-2 \cdot \log u1\right)}^{0.5}}{6}, \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(\frac{1 \cdot {\left(-2 \cdot \log u1\right)}^{0.5}}{6}, \cos \left(\left(2 \cdot \pi\right) \cdot u2\right), 0.5\right)
double f(double u1, double u2) {
        double r74918 = 1.0;
        double r74919 = 6.0;
        double r74920 = r74918 / r74919;
        double r74921 = -2.0;
        double r74922 = u1;
        double r74923 = log(r74922);
        double r74924 = r74921 * r74923;
        double r74925 = 0.5;
        double r74926 = pow(r74924, r74925);
        double r74927 = r74920 * r74926;
        double r74928 = 2.0;
        double r74929 = atan2(1.0, 0.0);
        double r74930 = r74928 * r74929;
        double r74931 = u2;
        double r74932 = r74930 * r74931;
        double r74933 = cos(r74932);
        double r74934 = r74927 * r74933;
        double r74935 = r74934 + r74925;
        return r74935;
}

double f(double u1, double u2) {
        double r74936 = 1.0;
        double r74937 = -2.0;
        double r74938 = u1;
        double r74939 = log(r74938);
        double r74940 = r74937 * r74939;
        double r74941 = 0.5;
        double r74942 = pow(r74940, r74941);
        double r74943 = r74936 * r74942;
        double r74944 = 6.0;
        double r74945 = r74943 / r74944;
        double r74946 = 2.0;
        double r74947 = atan2(1.0, 0.0);
        double r74948 = r74946 * r74947;
        double r74949 = u2;
        double r74950 = r74948 * r74949;
        double r74951 = cos(r74950);
        double r74952 = fma(r74945, r74951, r74941);
        return r74952;
}

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 associate-*l/0.3

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

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

Reproduce

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