Average Error: 0.2 → 0.2
Time: 30.7s
Precision: 64
\[\left({\left(a \cdot a + b \cdot b\right)}^{2} + 4 \cdot \left(\left(a \cdot a\right) \cdot \left(1 + a\right) + \left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right)\right)\right) - 1\]
\[\mathsf{fma}\left(4, \mathsf{fma}\left(a \cdot a, 1 + a, \left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right)\right), {\left(\mathsf{fma}\left(a, a, b \cdot b\right)\right)}^{2}\right) - 1\]
\left({\left(a \cdot a + b \cdot b\right)}^{2} + 4 \cdot \left(\left(a \cdot a\right) \cdot \left(1 + a\right) + \left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right)\right)\right) - 1
\mathsf{fma}\left(4, \mathsf{fma}\left(a \cdot a, 1 + a, \left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right)\right), {\left(\mathsf{fma}\left(a, a, b \cdot b\right)\right)}^{2}\right) - 1
double f(double a, double b) {
        double r199872 = a;
        double r199873 = r199872 * r199872;
        double r199874 = b;
        double r199875 = r199874 * r199874;
        double r199876 = r199873 + r199875;
        double r199877 = 2.0;
        double r199878 = pow(r199876, r199877);
        double r199879 = 4.0;
        double r199880 = 1.0;
        double r199881 = r199880 + r199872;
        double r199882 = r199873 * r199881;
        double r199883 = 3.0;
        double r199884 = r199883 * r199872;
        double r199885 = r199880 - r199884;
        double r199886 = r199875 * r199885;
        double r199887 = r199882 + r199886;
        double r199888 = r199879 * r199887;
        double r199889 = r199878 + r199888;
        double r199890 = r199889 - r199880;
        return r199890;
}

double f(double a, double b) {
        double r199891 = 4.0;
        double r199892 = a;
        double r199893 = r199892 * r199892;
        double r199894 = 1.0;
        double r199895 = r199894 + r199892;
        double r199896 = b;
        double r199897 = r199896 * r199896;
        double r199898 = 3.0;
        double r199899 = r199898 * r199892;
        double r199900 = r199894 - r199899;
        double r199901 = r199897 * r199900;
        double r199902 = fma(r199893, r199895, r199901);
        double r199903 = fma(r199892, r199892, r199897);
        double r199904 = 2.0;
        double r199905 = pow(r199903, r199904);
        double r199906 = fma(r199891, r199902, r199905);
        double r199907 = r199906 - r199894;
        return r199907;
}

Error

Bits error versus a

Bits error versus b

Derivation

  1. Initial program 0.2

    \[\left({\left(a \cdot a + b \cdot b\right)}^{2} + 4 \cdot \left(\left(a \cdot a\right) \cdot \left(1 + a\right) + \left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right)\right)\right) - 1\]
  2. Simplified0.2

    \[\leadsto \color{blue}{\mathsf{fma}\left(4, \mathsf{fma}\left(a \cdot a, 1 + a, \left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right)\right), {\left(\mathsf{fma}\left(a, a, b \cdot b\right)\right)}^{2}\right) - 1}\]
  3. Final simplification0.2

    \[\leadsto \mathsf{fma}\left(4, \mathsf{fma}\left(a \cdot a, 1 + a, \left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right)\right), {\left(\mathsf{fma}\left(a, a, b \cdot b\right)\right)}^{2}\right) - 1\]

Reproduce

herbie shell --seed 2019199 +o rules:numerics
(FPCore (a b)
  :name "Bouland and Aaronson, Equation (25)"
  (- (+ (pow (+ (* a a) (* b b)) 2.0) (* 4.0 (+ (* (* a a) (+ 1.0 a)) (* (* b b) (- 1.0 (* 3.0 a)))))) 1.0))