Average Error: 0.2 → 0.2
Time: 26.8s
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 r223776 = a;
        double r223777 = r223776 * r223776;
        double r223778 = b;
        double r223779 = r223778 * r223778;
        double r223780 = r223777 + r223779;
        double r223781 = 2.0;
        double r223782 = pow(r223780, r223781);
        double r223783 = 4.0;
        double r223784 = 1.0;
        double r223785 = r223784 + r223776;
        double r223786 = r223777 * r223785;
        double r223787 = 3.0;
        double r223788 = r223787 * r223776;
        double r223789 = r223784 - r223788;
        double r223790 = r223779 * r223789;
        double r223791 = r223786 + r223790;
        double r223792 = r223783 * r223791;
        double r223793 = r223782 + r223792;
        double r223794 = r223793 - r223784;
        return r223794;
}

double f(double a, double b) {
        double r223795 = 4.0;
        double r223796 = a;
        double r223797 = r223796 * r223796;
        double r223798 = 1.0;
        double r223799 = r223798 + r223796;
        double r223800 = b;
        double r223801 = r223800 * r223800;
        double r223802 = 3.0;
        double r223803 = r223802 * r223796;
        double r223804 = r223798 - r223803;
        double r223805 = r223801 * r223804;
        double r223806 = fma(r223797, r223799, r223805);
        double r223807 = fma(r223796, r223796, r223801);
        double r223808 = 2.0;
        double r223809 = pow(r223807, r223808);
        double r223810 = fma(r223795, r223806, r223809);
        double r223811 = r223810 - r223798;
        return r223811;
}

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