Average Error: 0.2 → 0.2
Time: 5.7s
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 r182456 = a;
        double r182457 = r182456 * r182456;
        double r182458 = b;
        double r182459 = r182458 * r182458;
        double r182460 = r182457 + r182459;
        double r182461 = 2.0;
        double r182462 = pow(r182460, r182461);
        double r182463 = 4.0;
        double r182464 = 1.0;
        double r182465 = r182464 + r182456;
        double r182466 = r182457 * r182465;
        double r182467 = 3.0;
        double r182468 = r182467 * r182456;
        double r182469 = r182464 - r182468;
        double r182470 = r182459 * r182469;
        double r182471 = r182466 + r182470;
        double r182472 = r182463 * r182471;
        double r182473 = r182462 + r182472;
        double r182474 = r182473 - r182464;
        return r182474;
}

double f(double a, double b) {
        double r182475 = 4.0;
        double r182476 = a;
        double r182477 = r182476 * r182476;
        double r182478 = 1.0;
        double r182479 = r182478 + r182476;
        double r182480 = b;
        double r182481 = r182480 * r182480;
        double r182482 = 3.0;
        double r182483 = r182482 * r182476;
        double r182484 = r182478 - r182483;
        double r182485 = r182481 * r182484;
        double r182486 = fma(r182477, r182479, r182485);
        double r182487 = r182477 + r182481;
        double r182488 = 2.0;
        double r182489 = pow(r182487, r182488);
        double r182490 = r182489 - r182478;
        double r182491 = fma(r182475, r182486, r182490);
        return r182491;
}

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