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 r218778 = a;
        double r218779 = r218778 * r218778;
        double r218780 = b;
        double r218781 = r218780 * r218780;
        double r218782 = r218779 + r218781;
        double r218783 = 2.0;
        double r218784 = pow(r218782, r218783);
        double r218785 = 4.0;
        double r218786 = 1.0;
        double r218787 = r218786 - r218778;
        double r218788 = r218779 * r218787;
        double r218789 = 3.0;
        double r218790 = r218789 + r218778;
        double r218791 = r218781 * r218790;
        double r218792 = r218788 + r218791;
        double r218793 = r218785 * r218792;
        double r218794 = r218784 + r218793;
        double r218795 = r218794 - r218786;
        return r218795;
}

double f(double a, double b) {
        double r218796 = 4.0;
        double r218797 = a;
        double r218798 = r218797 * r218797;
        double r218799 = 1.0;
        double r218800 = r218799 - r218797;
        double r218801 = b;
        double r218802 = r218801 * r218801;
        double r218803 = 3.0;
        double r218804 = r218803 + r218797;
        double r218805 = r218802 * r218804;
        double r218806 = fma(r218798, r218800, r218805);
        double r218807 = r218798 + r218802;
        double r218808 = 2.0;
        double r218809 = pow(r218807, r218808);
        double r218810 = r218809 - r218799;
        double r218811 = fma(r218796, r218806, r218810);
        return r218811;
}

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))