Average Error: 0.2 → 0.2
Time: 6.4s
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(3 + a\right)\right)\right) - 1\]
\[\mathsf{fma}\left(4, \mathsf{fma}\left(a \cdot a, 1 - a, \left(b \cdot b\right) \cdot \left(3 + 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(3 + a\right)\right)\right) - 1
\mathsf{fma}\left(4, \mathsf{fma}\left(a \cdot a, 1 - a, \left(b \cdot b\right) \cdot \left(3 + a\right)\right), {\left(a \cdot a + b \cdot b\right)}^{2} - 1\right)
double f(double a, double b) {
        double r383734 = a;
        double r383735 = r383734 * r383734;
        double r383736 = b;
        double r383737 = r383736 * r383736;
        double r383738 = r383735 + r383737;
        double r383739 = 2.0;
        double r383740 = pow(r383738, r383739);
        double r383741 = 4.0;
        double r383742 = 1.0;
        double r383743 = r383742 - r383734;
        double r383744 = r383735 * r383743;
        double r383745 = 3.0;
        double r383746 = r383745 + r383734;
        double r383747 = r383737 * r383746;
        double r383748 = r383744 + r383747;
        double r383749 = r383741 * r383748;
        double r383750 = r383740 + r383749;
        double r383751 = r383750 - r383742;
        return r383751;
}

double f(double a, double b) {
        double r383752 = 4.0;
        double r383753 = a;
        double r383754 = r383753 * r383753;
        double r383755 = 1.0;
        double r383756 = r383755 - r383753;
        double r383757 = b;
        double r383758 = r383757 * r383757;
        double r383759 = 3.0;
        double r383760 = r383759 + r383753;
        double r383761 = r383758 * r383760;
        double r383762 = fma(r383754, r383756, r383761);
        double r383763 = r383754 + r383758;
        double r383764 = 2.0;
        double r383765 = pow(r383763, r383764);
        double r383766 = r383765 - r383755;
        double r383767 = fma(r383752, r383762, r383766);
        return r383767;
}

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

Reproduce

herbie shell --seed 2020001 +o rules:numerics
(FPCore (a b)
  :name "Bouland and Aaronson, Equation (24)"
  :precision binary64
  (- (+ (pow (+ (* a a) (* b b)) 2) (* 4 (+ (* (* a a) (- 1 a)) (* (* b b) (+ 3 a))))) 1))