Average Error: 0.2 → 0.2
Time: 5.1s
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\]
\[\left(\mathsf{fma}\left({a}^{2}, \left(1 + a\right) \cdot 4, {\left(a \cdot a + b \cdot b\right)}^{2}\right) + 4 \cdot \left(\left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right)\right)\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(1 - 3 \cdot a\right)\right)\right) - 1
\left(\mathsf{fma}\left({a}^{2}, \left(1 + a\right) \cdot 4, {\left(a \cdot a + b \cdot b\right)}^{2}\right) + 4 \cdot \left(\left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right)\right)\right) - 1
double f(double a, double b) {
        double r154269 = a;
        double r154270 = r154269 * r154269;
        double r154271 = b;
        double r154272 = r154271 * r154271;
        double r154273 = r154270 + r154272;
        double r154274 = 2.0;
        double r154275 = pow(r154273, r154274);
        double r154276 = 4.0;
        double r154277 = 1.0;
        double r154278 = r154277 + r154269;
        double r154279 = r154270 * r154278;
        double r154280 = 3.0;
        double r154281 = r154280 * r154269;
        double r154282 = r154277 - r154281;
        double r154283 = r154272 * r154282;
        double r154284 = r154279 + r154283;
        double r154285 = r154276 * r154284;
        double r154286 = r154275 + r154285;
        double r154287 = r154286 - r154277;
        return r154287;
}

double f(double a, double b) {
        double r154288 = a;
        double r154289 = 2.0;
        double r154290 = pow(r154288, r154289);
        double r154291 = 1.0;
        double r154292 = r154291 + r154288;
        double r154293 = 4.0;
        double r154294 = r154292 * r154293;
        double r154295 = r154288 * r154288;
        double r154296 = b;
        double r154297 = r154296 * r154296;
        double r154298 = r154295 + r154297;
        double r154299 = 2.0;
        double r154300 = pow(r154298, r154299);
        double r154301 = fma(r154290, r154294, r154300);
        double r154302 = 3.0;
        double r154303 = r154302 * r154288;
        double r154304 = r154291 - r154303;
        double r154305 = r154297 * r154304;
        double r154306 = r154293 * r154305;
        double r154307 = r154301 + r154306;
        double r154308 = r154307 - r154291;
        return r154308;
}

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. Using strategy rm
  3. Applied distribute-lft-in0.2

    \[\leadsto \left({\left(a \cdot a + b \cdot b\right)}^{2} + \color{blue}{\left(4 \cdot \left(\left(a \cdot a\right) \cdot \left(1 + a\right)\right) + 4 \cdot \left(\left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right)\right)\right)}\right) - 1\]
  4. Applied associate-+r+0.2

    \[\leadsto \color{blue}{\left(\left({\left(a \cdot a + b \cdot b\right)}^{2} + 4 \cdot \left(\left(a \cdot a\right) \cdot \left(1 + a\right)\right)\right) + 4 \cdot \left(\left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right)\right)\right)} - 1\]
  5. Simplified0.2

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

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

Reproduce

herbie shell --seed 2020049 +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))