Average Error: 0.2 → 0.2
Time: 5.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(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 r342401 = a;
        double r342402 = r342401 * r342401;
        double r342403 = b;
        double r342404 = r342403 * r342403;
        double r342405 = r342402 + r342404;
        double r342406 = 2.0;
        double r342407 = pow(r342405, r342406);
        double r342408 = 4.0;
        double r342409 = 1.0;
        double r342410 = r342409 + r342401;
        double r342411 = r342402 * r342410;
        double r342412 = 3.0;
        double r342413 = r342412 * r342401;
        double r342414 = r342409 - r342413;
        double r342415 = r342404 * r342414;
        double r342416 = r342411 + r342415;
        double r342417 = r342408 * r342416;
        double r342418 = r342407 + r342417;
        double r342419 = r342418 - r342409;
        return r342419;
}

double f(double a, double b) {
        double r342420 = 4.0;
        double r342421 = a;
        double r342422 = r342421 * r342421;
        double r342423 = 1.0;
        double r342424 = r342423 + r342421;
        double r342425 = b;
        double r342426 = r342425 * r342425;
        double r342427 = 3.0;
        double r342428 = r342427 * r342421;
        double r342429 = r342423 - r342428;
        double r342430 = r342426 * r342429;
        double r342431 = fma(r342422, r342424, r342430);
        double r342432 = r342422 + r342426;
        double r342433 = 2.0;
        double r342434 = pow(r342432, r342433);
        double r342435 = r342434 - r342423;
        double r342436 = fma(r342420, r342431, r342435);
        return r342436;
}

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