Average Error: 0.2 → 0.2
Time: 5.0s
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 r294196 = a;
        double r294197 = r294196 * r294196;
        double r294198 = b;
        double r294199 = r294198 * r294198;
        double r294200 = r294197 + r294199;
        double r294201 = 2.0;
        double r294202 = pow(r294200, r294201);
        double r294203 = 4.0;
        double r294204 = r294203 * r294199;
        double r294205 = r294202 + r294204;
        double r294206 = 1.0;
        double r294207 = r294205 - r294206;
        return r294207;
}

double f(double a, double b) {
        double r294208 = 4.0;
        double r294209 = b;
        double r294210 = r294208 * r294209;
        double r294211 = a;
        double r294212 = r294211 * r294211;
        double r294213 = r294209 * r294209;
        double r294214 = r294212 + r294213;
        double r294215 = 2.0;
        double r294216 = pow(r294214, r294215);
        double r294217 = 1.0;
        double r294218 = r294216 - r294217;
        double r294219 = fma(r294210, r294209, r294218);
        return r294219;
}

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