Average Error: 0.2 → 0.2
Time: 8.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(a \cdot a + b \cdot b\right)}^{2} - 1\right)\]
\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(a \cdot a + b \cdot b\right)}^{2} - 1\right)
double f(double a, double b) {
        double r127633 = a;
        double r127634 = r127633 * r127633;
        double r127635 = b;
        double r127636 = r127635 * r127635;
        double r127637 = r127634 + r127636;
        double r127638 = 2.0;
        double r127639 = pow(r127637, r127638);
        double r127640 = 4.0;
        double r127641 = 1.0;
        double r127642 = r127641 + r127633;
        double r127643 = r127634 * r127642;
        double r127644 = 3.0;
        double r127645 = r127644 * r127633;
        double r127646 = r127641 - r127645;
        double r127647 = r127636 * r127646;
        double r127648 = r127643 + r127647;
        double r127649 = r127640 * r127648;
        double r127650 = r127639 + r127649;
        double r127651 = r127650 - r127641;
        return r127651;
}

double f(double a, double b) {
        double r127652 = 4.0;
        double r127653 = a;
        double r127654 = r127653 * r127653;
        double r127655 = 1.0;
        double r127656 = r127655 + r127653;
        double r127657 = b;
        double r127658 = r127657 * r127657;
        double r127659 = 3.0;
        double r127660 = r127659 * r127653;
        double r127661 = r127655 - r127660;
        double r127662 = r127658 * r127661;
        double r127663 = fma(r127654, r127656, r127662);
        double r127664 = r127654 + r127658;
        double r127665 = 2.0;
        double r127666 = pow(r127664, r127665);
        double r127667 = r127666 - r127655;
        double r127668 = fma(r127652, r127663, r127667);
        return r127668;
}

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

Reproduce

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