Average Error: 0.2 → 0.2
Time: 24.9s
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(\left(a \cdot a + b \cdot b\right), \left(a \cdot a + b \cdot b\right), \left(4 \cdot \left(\left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right) + \left(a \cdot a\right) \cdot \left(a + 1\right)\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
\mathsf{fma}\left(\left(a \cdot a + b \cdot b\right), \left(a \cdot a + b \cdot b\right), \left(4 \cdot \left(\left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right) + \left(a \cdot a\right) \cdot \left(a + 1\right)\right)\right)\right) - 1
double f(double a, double b) {
        double r8146753 = a;
        double r8146754 = r8146753 * r8146753;
        double r8146755 = b;
        double r8146756 = r8146755 * r8146755;
        double r8146757 = r8146754 + r8146756;
        double r8146758 = 2.0;
        double r8146759 = pow(r8146757, r8146758);
        double r8146760 = 4.0;
        double r8146761 = 1.0;
        double r8146762 = r8146761 + r8146753;
        double r8146763 = r8146754 * r8146762;
        double r8146764 = 3.0;
        double r8146765 = r8146764 * r8146753;
        double r8146766 = r8146761 - r8146765;
        double r8146767 = r8146756 * r8146766;
        double r8146768 = r8146763 + r8146767;
        double r8146769 = r8146760 * r8146768;
        double r8146770 = r8146759 + r8146769;
        double r8146771 = r8146770 - r8146761;
        return r8146771;
}

double f(double a, double b) {
        double r8146772 = a;
        double r8146773 = r8146772 * r8146772;
        double r8146774 = b;
        double r8146775 = r8146774 * r8146774;
        double r8146776 = r8146773 + r8146775;
        double r8146777 = 4.0;
        double r8146778 = 1.0;
        double r8146779 = 3.0;
        double r8146780 = r8146779 * r8146772;
        double r8146781 = r8146778 - r8146780;
        double r8146782 = r8146775 * r8146781;
        double r8146783 = r8146772 + r8146778;
        double r8146784 = r8146773 * r8146783;
        double r8146785 = r8146782 + r8146784;
        double r8146786 = r8146777 * r8146785;
        double r8146787 = fma(r8146776, r8146776, r8146786);
        double r8146788 = r8146787 - r8146778;
        return r8146788;
}

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 unpow20.2

    \[\leadsto \left(\color{blue}{\left(a \cdot a + b \cdot b\right) \cdot \left(a \cdot a + b \cdot b\right)} + 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\]
  4. Applied fma-def0.2

    \[\leadsto \color{blue}{\mathsf{fma}\left(\left(a \cdot a + b \cdot b\right), \left(a \cdot a + b \cdot b\right), \left(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)\right)} - 1\]
  5. Final simplification0.2

    \[\leadsto \mathsf{fma}\left(\left(a \cdot a + b \cdot b\right), \left(a \cdot a + b \cdot b\right), \left(4 \cdot \left(\left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right) + \left(a \cdot a\right) \cdot \left(a + 1\right)\right)\right)\right) - 1\]

Reproduce

herbie shell --seed 2019129 +o rules:numerics
(FPCore (a b)
  :name "Bouland and Aaronson, Equation (25)"
  (- (+ (pow (+ (* a a) (* b b)) 2) (* 4 (+ (* (* a a) (+ 1 a)) (* (* b b) (- 1 (* 3 a)))))) 1))