Average Error: 0.2 → 0.2
Time: 5.4s
Precision: 64
\[\left({\left(a \cdot a + b \cdot b\right)}^{2} + 4 \cdot \left(b \cdot b\right)\right) - 1\]
\[\mathsf{fma}\left(4 \cdot b, b, {\left(a \cdot a + b \cdot b\right)}^{2} - 1\right)\]
\left({\left(a \cdot a + b \cdot b\right)}^{2} + 4 \cdot \left(b \cdot b\right)\right) - 1
\mathsf{fma}\left(4 \cdot b, b, {\left(a \cdot a + b \cdot b\right)}^{2} - 1\right)
double f(double a, double b) {
        double r320697 = a;
        double r320698 = r320697 * r320697;
        double r320699 = b;
        double r320700 = r320699 * r320699;
        double r320701 = r320698 + r320700;
        double r320702 = 2.0;
        double r320703 = pow(r320701, r320702);
        double r320704 = 4.0;
        double r320705 = r320704 * r320700;
        double r320706 = r320703 + r320705;
        double r320707 = 1.0;
        double r320708 = r320706 - r320707;
        return r320708;
}

double f(double a, double b) {
        double r320709 = 4.0;
        double r320710 = b;
        double r320711 = r320709 * r320710;
        double r320712 = a;
        double r320713 = r320712 * r320712;
        double r320714 = r320710 * r320710;
        double r320715 = r320713 + r320714;
        double r320716 = 2.0;
        double r320717 = pow(r320715, r320716);
        double r320718 = 1.0;
        double r320719 = r320717 - r320718;
        double r320720 = fma(r320711, r320710, r320719);
        return r320720;
}

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(b \cdot b\right)\right) - 1\]
  2. Simplified0.2

    \[\leadsto \color{blue}{\mathsf{fma}\left(4 \cdot b, b, {\left(a \cdot a + b \cdot b\right)}^{2} - 1\right)}\]
  3. Final simplification0.2

    \[\leadsto \mathsf{fma}\left(4 \cdot b, b, {\left(a \cdot a + b \cdot b\right)}^{2} - 1\right)\]

Reproduce

herbie shell --seed 2019362 +o rules:numerics
(FPCore (a b)
  :name "Bouland and Aaronson, Equation (26)"
  :precision binary64
  (- (+ (pow (+ (* a a) (* b b)) 2) (* 4 (* b b))) 1))