Average Error: 0.2 → 0.2
Time: 21.3s
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 r209078 = a;
        double r209079 = r209078 * r209078;
        double r209080 = b;
        double r209081 = r209080 * r209080;
        double r209082 = r209079 + r209081;
        double r209083 = 2.0;
        double r209084 = pow(r209082, r209083);
        double r209085 = 4.0;
        double r209086 = 1.0;
        double r209087 = r209086 - r209078;
        double r209088 = r209079 * r209087;
        double r209089 = 3.0;
        double r209090 = r209089 + r209078;
        double r209091 = r209081 * r209090;
        double r209092 = r209088 + r209091;
        double r209093 = r209085 * r209092;
        double r209094 = r209084 + r209093;
        double r209095 = r209094 - r209086;
        return r209095;
}

double f(double a, double b) {
        double r209096 = a;
        double r209097 = r209096 * r209096;
        double r209098 = 1.0;
        double r209099 = r209098 - r209096;
        double r209100 = b;
        double r209101 = r209100 * r209100;
        double r209102 = 3.0;
        double r209103 = r209102 + r209096;
        double r209104 = r209101 * r209103;
        double r209105 = fma(r209097, r209099, r209104);
        double r209106 = 4.0;
        double r209107 = fma(r209096, r209096, r209101);
        double r209108 = 2.0;
        double r209109 = pow(r209107, r209108);
        double r209110 = fma(r209105, r209106, r209109);
        double r209111 = r209110 - r209098;
        return r209111;
}

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