Average Error: 0.2 → 0.2
Time: 5.8s
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 r118267 = a;
        double r118268 = r118267 * r118267;
        double r118269 = b;
        double r118270 = r118269 * r118269;
        double r118271 = r118268 + r118270;
        double r118272 = 2.0;
        double r118273 = pow(r118271, r118272);
        double r118274 = 4.0;
        double r118275 = 1.0;
        double r118276 = r118275 + r118267;
        double r118277 = r118268 * r118276;
        double r118278 = 3.0;
        double r118279 = r118278 * r118267;
        double r118280 = r118275 - r118279;
        double r118281 = r118270 * r118280;
        double r118282 = r118277 + r118281;
        double r118283 = r118274 * r118282;
        double r118284 = r118273 + r118283;
        double r118285 = r118284 - r118275;
        return r118285;
}

double f(double a, double b) {
        double r118286 = 4.0;
        double r118287 = a;
        double r118288 = r118287 * r118287;
        double r118289 = 1.0;
        double r118290 = r118289 + r118287;
        double r118291 = b;
        double r118292 = r118291 * r118291;
        double r118293 = 3.0;
        double r118294 = r118293 * r118287;
        double r118295 = r118289 - r118294;
        double r118296 = r118292 * r118295;
        double r118297 = fma(r118288, r118290, r118296);
        double r118298 = r118288 + r118292;
        double r118299 = 2.0;
        double r118300 = pow(r118298, r118299);
        double r118301 = r118300 - r118289;
        double r118302 = fma(r118286, r118297, r118301);
        return r118302;
}

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