Average Error: 0.2 → 0.2
Time: 30.5s
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 r118566 = a;
        double r118567 = r118566 * r118566;
        double r118568 = b;
        double r118569 = r118568 * r118568;
        double r118570 = r118567 + r118569;
        double r118571 = 2.0;
        double r118572 = pow(r118570, r118571);
        double r118573 = 4.0;
        double r118574 = 1.0;
        double r118575 = r118574 + r118566;
        double r118576 = r118567 * r118575;
        double r118577 = 3.0;
        double r118578 = r118577 * r118566;
        double r118579 = r118574 - r118578;
        double r118580 = r118569 * r118579;
        double r118581 = r118576 + r118580;
        double r118582 = r118573 * r118581;
        double r118583 = r118572 + r118582;
        double r118584 = r118583 - r118574;
        return r118584;
}

double f(double a, double b) {
        double r118585 = 4.0;
        double r118586 = a;
        double r118587 = r118586 * r118586;
        double r118588 = 1.0;
        double r118589 = r118588 + r118586;
        double r118590 = b;
        double r118591 = r118590 * r118590;
        double r118592 = 3.0;
        double r118593 = r118592 * r118586;
        double r118594 = r118588 - r118593;
        double r118595 = r118591 * r118594;
        double r118596 = fma(r118587, r118589, r118595);
        double r118597 = fma(r118586, r118586, r118591);
        double r118598 = 2.0;
        double r118599 = pow(r118597, r118598);
        double r118600 = fma(r118585, r118596, r118599);
        double r118601 = r118600 - r118588;
        return r118601;
}

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 2019199 +o rules:numerics
(FPCore (a b)
  :name "Bouland and Aaronson, Equation (25)"
  (- (+ (pow (+ (* a a) (* b b)) 2.0) (* 4.0 (+ (* (* a a) (+ 1.0 a)) (* (* b b) (- 1.0 (* 3.0 a)))))) 1.0))