Average Error: 0.2 → 0.2
Time: 6.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(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 r125664 = a;
        double r125665 = r125664 * r125664;
        double r125666 = b;
        double r125667 = r125666 * r125666;
        double r125668 = r125665 + r125667;
        double r125669 = 2.0;
        double r125670 = pow(r125668, r125669);
        double r125671 = 4.0;
        double r125672 = 1.0;
        double r125673 = r125672 + r125664;
        double r125674 = r125665 * r125673;
        double r125675 = 3.0;
        double r125676 = r125675 * r125664;
        double r125677 = r125672 - r125676;
        double r125678 = r125667 * r125677;
        double r125679 = r125674 + r125678;
        double r125680 = r125671 * r125679;
        double r125681 = r125670 + r125680;
        double r125682 = r125681 - r125672;
        return r125682;
}

double f(double a, double b) {
        double r125683 = 4.0;
        double r125684 = a;
        double r125685 = r125684 * r125684;
        double r125686 = 1.0;
        double r125687 = r125686 + r125684;
        double r125688 = b;
        double r125689 = r125688 * r125688;
        double r125690 = 3.0;
        double r125691 = r125690 * r125684;
        double r125692 = r125686 - r125691;
        double r125693 = r125689 * r125692;
        double r125694 = fma(r125685, r125687, r125693);
        double r125695 = r125685 + r125689;
        double r125696 = 2.0;
        double r125697 = pow(r125695, r125696);
        double r125698 = r125697 - r125686;
        double r125699 = fma(r125683, r125694, r125698);
        return r125699;
}

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