Average Error: 0.2 → 0.2
Time: 6.3s
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(a \cdot a + b \cdot b\right)}^{2} - 1\right)\]
\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(a \cdot a + b \cdot b\right)}^{2} - 1\right)
double f(double a, double b) {
        double r355045 = a;
        double r355046 = r355045 * r355045;
        double r355047 = b;
        double r355048 = r355047 * r355047;
        double r355049 = r355046 + r355048;
        double r355050 = 2.0;
        double r355051 = pow(r355049, r355050);
        double r355052 = 4.0;
        double r355053 = 1.0;
        double r355054 = r355053 + r355045;
        double r355055 = r355046 * r355054;
        double r355056 = 3.0;
        double r355057 = r355056 * r355045;
        double r355058 = r355053 - r355057;
        double r355059 = r355048 * r355058;
        double r355060 = r355055 + r355059;
        double r355061 = r355052 * r355060;
        double r355062 = r355051 + r355061;
        double r355063 = r355062 - r355053;
        return r355063;
}

double f(double a, double b) {
        double r355064 = 4.0;
        double r355065 = a;
        double r355066 = r355065 * r355065;
        double r355067 = 1.0;
        double r355068 = r355067 + r355065;
        double r355069 = b;
        double r355070 = r355069 * r355069;
        double r355071 = 3.0;
        double r355072 = r355071 * r355065;
        double r355073 = r355067 - r355072;
        double r355074 = r355070 * r355073;
        double r355075 = fma(r355066, r355068, r355074);
        double r355076 = r355066 + r355070;
        double r355077 = 2.0;
        double r355078 = pow(r355076, r355077);
        double r355079 = r355078 - r355067;
        double r355080 = fma(r355064, r355075, r355079);
        return r355080;
}

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(a \cdot a + b \cdot b\right)}^{2} - 1\right)}\]
  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(a \cdot a + b \cdot b\right)}^{2} - 1\right)\]

Reproduce

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