Average Error: 0.2 → 0.2
Time: 16.0s
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(3 + a\right)\right)\right) - 1\]
\[\mathsf{fma}\left(\mathsf{fma}\left(a \cdot a, 1 - a, \left(b \cdot b\right) \cdot \left(3 + a\right)\right), 4, {\left(\mathsf{fma}\left(a, a, b \cdot b\right)\right)}^{2}\right) - 1\]
\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(3 + a\right)\right)\right) - 1
\mathsf{fma}\left(\mathsf{fma}\left(a \cdot a, 1 - a, \left(b \cdot b\right) \cdot \left(3 + a\right)\right), 4, {\left(\mathsf{fma}\left(a, a, b \cdot b\right)\right)}^{2}\right) - 1
double f(double a, double b) {
        double r225212 = a;
        double r225213 = r225212 * r225212;
        double r225214 = b;
        double r225215 = r225214 * r225214;
        double r225216 = r225213 + r225215;
        double r225217 = 2.0;
        double r225218 = pow(r225216, r225217);
        double r225219 = 4.0;
        double r225220 = 1.0;
        double r225221 = r225220 - r225212;
        double r225222 = r225213 * r225221;
        double r225223 = 3.0;
        double r225224 = r225223 + r225212;
        double r225225 = r225215 * r225224;
        double r225226 = r225222 + r225225;
        double r225227 = r225219 * r225226;
        double r225228 = r225218 + r225227;
        double r225229 = r225228 - r225220;
        return r225229;
}

double f(double a, double b) {
        double r225230 = a;
        double r225231 = r225230 * r225230;
        double r225232 = 1.0;
        double r225233 = r225232 - r225230;
        double r225234 = b;
        double r225235 = r225234 * r225234;
        double r225236 = 3.0;
        double r225237 = r225236 + r225230;
        double r225238 = r225235 * r225237;
        double r225239 = fma(r225231, r225233, r225238);
        double r225240 = 4.0;
        double r225241 = fma(r225230, r225230, r225235);
        double r225242 = 2.0;
        double r225243 = pow(r225241, r225242);
        double r225244 = fma(r225239, r225240, r225243);
        double r225245 = r225244 - r225232;
        return r225245;
}

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(3 + a\right)\right)\right) - 1\]
  2. Simplified0.2

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

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

Reproduce

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