Average Error: 0.2 → 0.2
Time: 27.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(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 r164998 = a;
        double r164999 = r164998 * r164998;
        double r165000 = b;
        double r165001 = r165000 * r165000;
        double r165002 = r164999 + r165001;
        double r165003 = 2.0;
        double r165004 = pow(r165002, r165003);
        double r165005 = 4.0;
        double r165006 = 1.0;
        double r165007 = r165006 - r164998;
        double r165008 = r164999 * r165007;
        double r165009 = 3.0;
        double r165010 = r165009 + r164998;
        double r165011 = r165001 * r165010;
        double r165012 = r165008 + r165011;
        double r165013 = r165005 * r165012;
        double r165014 = r165004 + r165013;
        double r165015 = r165014 - r165006;
        return r165015;
}

double f(double a, double b) {
        double r165016 = a;
        double r165017 = r165016 * r165016;
        double r165018 = 1.0;
        double r165019 = r165018 - r165016;
        double r165020 = b;
        double r165021 = r165020 * r165020;
        double r165022 = 3.0;
        double r165023 = r165022 + r165016;
        double r165024 = r165021 * r165023;
        double r165025 = fma(r165017, r165019, r165024);
        double r165026 = 4.0;
        double r165027 = fma(r165016, r165016, r165021);
        double r165028 = 2.0;
        double r165029 = pow(r165027, r165028);
        double r165030 = fma(r165025, r165026, r165029);
        double r165031 = r165030 - r165018;
        return r165031;
}

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