Average Error: 0.2 → 0.2
Time: 8.1s
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 r163697 = a;
        double r163698 = r163697 * r163697;
        double r163699 = b;
        double r163700 = r163699 * r163699;
        double r163701 = r163698 + r163700;
        double r163702 = 2.0;
        double r163703 = pow(r163701, r163702);
        double r163704 = 4.0;
        double r163705 = 1.0;
        double r163706 = r163705 + r163697;
        double r163707 = r163698 * r163706;
        double r163708 = 3.0;
        double r163709 = r163708 * r163697;
        double r163710 = r163705 - r163709;
        double r163711 = r163700 * r163710;
        double r163712 = r163707 + r163711;
        double r163713 = r163704 * r163712;
        double r163714 = r163703 + r163713;
        double r163715 = r163714 - r163705;
        return r163715;
}

double f(double a, double b) {
        double r163716 = 4.0;
        double r163717 = a;
        double r163718 = r163717 * r163717;
        double r163719 = 1.0;
        double r163720 = r163719 + r163717;
        double r163721 = b;
        double r163722 = r163721 * r163721;
        double r163723 = 3.0;
        double r163724 = r163723 * r163717;
        double r163725 = r163719 - r163724;
        double r163726 = r163722 * r163725;
        double r163727 = fma(r163718, r163720, r163726);
        double r163728 = r163718 + r163722;
        double r163729 = 2.0;
        double r163730 = pow(r163728, r163729);
        double r163731 = r163730 - r163719;
        double r163732 = fma(r163716, r163727, r163731);
        return r163732;
}

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