Average Error: 0.2 → 0.2
Time: 16.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\]
\[\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(\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(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(\mathsf{fma}\left(a, a, b \cdot b\right)\right)}^{2}\right) - 1
double f(double a, double b) {
        double r150737 = a;
        double r150738 = r150737 * r150737;
        double r150739 = b;
        double r150740 = r150739 * r150739;
        double r150741 = r150738 + r150740;
        double r150742 = 2.0;
        double r150743 = pow(r150741, r150742);
        double r150744 = 4.0;
        double r150745 = 1.0;
        double r150746 = r150745 + r150737;
        double r150747 = r150738 * r150746;
        double r150748 = 3.0;
        double r150749 = r150748 * r150737;
        double r150750 = r150745 - r150749;
        double r150751 = r150740 * r150750;
        double r150752 = r150747 + r150751;
        double r150753 = r150744 * r150752;
        double r150754 = r150743 + r150753;
        double r150755 = r150754 - r150745;
        return r150755;
}

double f(double a, double b) {
        double r150756 = 4.0;
        double r150757 = a;
        double r150758 = r150757 * r150757;
        double r150759 = 1.0;
        double r150760 = r150759 + r150757;
        double r150761 = b;
        double r150762 = r150761 * r150761;
        double r150763 = 3.0;
        double r150764 = r150763 * r150757;
        double r150765 = r150759 - r150764;
        double r150766 = r150762 * r150765;
        double r150767 = fma(r150758, r150760, r150766);
        double r150768 = fma(r150757, r150757, r150762);
        double r150769 = 2.0;
        double r150770 = pow(r150768, r150769);
        double r150771 = fma(r150756, r150767, r150770);
        double r150772 = r150771 - r150759;
        return r150772;
}

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(\mathsf{fma}\left(a, a, b \cdot b\right)\right)}^{2}\right) - 1}\]
  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(\mathsf{fma}\left(a, a, b \cdot b\right)\right)}^{2}\right) - 1\]

Reproduce

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