Average Error: 0.2 → 0.2
Time: 6.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(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 r89253 = a;
        double r89254 = r89253 * r89253;
        double r89255 = b;
        double r89256 = r89255 * r89255;
        double r89257 = r89254 + r89256;
        double r89258 = 2.0;
        double r89259 = pow(r89257, r89258);
        double r89260 = 4.0;
        double r89261 = 1.0;
        double r89262 = r89261 + r89253;
        double r89263 = r89254 * r89262;
        double r89264 = 3.0;
        double r89265 = r89264 * r89253;
        double r89266 = r89261 - r89265;
        double r89267 = r89256 * r89266;
        double r89268 = r89263 + r89267;
        double r89269 = r89260 * r89268;
        double r89270 = r89259 + r89269;
        double r89271 = r89270 - r89261;
        return r89271;
}

double f(double a, double b) {
        double r89272 = a;
        double r89273 = 2.0;
        double r89274 = pow(r89272, r89273);
        double r89275 = 1.0;
        double r89276 = r89275 + r89272;
        double r89277 = 4.0;
        double r89278 = r89276 * r89277;
        double r89279 = r89272 * r89272;
        double r89280 = b;
        double r89281 = r89280 * r89280;
        double r89282 = r89279 + r89281;
        double r89283 = 2.0;
        double r89284 = pow(r89282, r89283);
        double r89285 = fma(r89274, r89278, r89284);
        double r89286 = 3.0;
        double r89287 = r89286 * r89272;
        double r89288 = r89275 - r89287;
        double r89289 = r89281 * r89288;
        double r89290 = r89277 * r89289;
        double r89291 = r89285 + r89290;
        double r89292 = r89291 - r89275;
        return r89292;
}

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