Average Error: 0.2 → 0.2
Time: 21.9s
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 r116864 = a;
        double r116865 = r116864 * r116864;
        double r116866 = b;
        double r116867 = r116866 * r116866;
        double r116868 = r116865 + r116867;
        double r116869 = 2.0;
        double r116870 = pow(r116868, r116869);
        double r116871 = 4.0;
        double r116872 = 1.0;
        double r116873 = r116872 + r116864;
        double r116874 = r116865 * r116873;
        double r116875 = 3.0;
        double r116876 = r116875 * r116864;
        double r116877 = r116872 - r116876;
        double r116878 = r116867 * r116877;
        double r116879 = r116874 + r116878;
        double r116880 = r116871 * r116879;
        double r116881 = r116870 + r116880;
        double r116882 = r116881 - r116872;
        return r116882;
}

double f(double a, double b) {
        double r116883 = 4.0;
        double r116884 = a;
        double r116885 = r116884 * r116884;
        double r116886 = 1.0;
        double r116887 = r116886 + r116884;
        double r116888 = b;
        double r116889 = r116888 * r116888;
        double r116890 = 3.0;
        double r116891 = r116890 * r116884;
        double r116892 = r116886 - r116891;
        double r116893 = r116889 * r116892;
        double r116894 = fma(r116885, r116887, r116893);
        double r116895 = fma(r116884, r116884, r116889);
        double r116896 = 2.0;
        double r116897 = pow(r116895, r116896);
        double r116898 = fma(r116883, r116894, r116897);
        double r116899 = r116898 - r116886;
        return r116899;
}

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 2019209 +o rules:numerics
(FPCore (a b)
  :name "Bouland and Aaronson, Equation (25)"
  :precision binary64
  (- (+ (pow (+ (* a a) (* b b)) 2) (* 4 (+ (* (* a a) (+ 1 a)) (* (* b b) (- 1 (* 3 a)))))) 1))