Average Error: 0.2 → 0.2
Time: 6.1s
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 r309291 = a;
        double r309292 = r309291 * r309291;
        double r309293 = b;
        double r309294 = r309293 * r309293;
        double r309295 = r309292 + r309294;
        double r309296 = 2.0;
        double r309297 = pow(r309295, r309296);
        double r309298 = 4.0;
        double r309299 = r309298 * r309294;
        double r309300 = r309297 + r309299;
        double r309301 = 1.0;
        double r309302 = r309300 - r309301;
        return r309302;
}

double f(double a, double b) {
        double r309303 = 4.0;
        double r309304 = b;
        double r309305 = r309303 * r309304;
        double r309306 = a;
        double r309307 = r309306 * r309306;
        double r309308 = r309304 * r309304;
        double r309309 = r309307 + r309308;
        double r309310 = 2.0;
        double r309311 = pow(r309309, r309310);
        double r309312 = 1.0;
        double r309313 = r309311 - r309312;
        double r309314 = fma(r309305, r309304, r309313);
        return r309314;
}

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 2020002 +o rules:numerics
(FPCore (a b)
  :name "Bouland and Aaronson, Equation (26)"
  :precision binary64
  (- (+ (pow (+ (* a a) (* b b)) 2) (* 4 (* b b))) 1))