Average Error: 0.2 → 0.9
Time: 22.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(1 - 3 \cdot a\right)\right)\right) - 1\]
\[\begin{array}{l} \mathbf{if}\;b \le -4.70669310275382700610447006539516223711 \cdot 10^{-4} \lor \neg \left(b \le 2.006560387622814189967357378918677568436\right):\\ \;\;\;\;\left({a}^{4} + \mathsf{fma}\left(2, {a}^{2} \cdot {b}^{2}, {b}^{4}\right)\right) - 1\\ \mathbf{else}:\\ \;\;\;\;\left({\left(\frac{1}{a}\right)}^{-4} + 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\\ \end{array}\]
\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
\begin{array}{l}
\mathbf{if}\;b \le -4.70669310275382700610447006539516223711 \cdot 10^{-4} \lor \neg \left(b \le 2.006560387622814189967357378918677568436\right):\\
\;\;\;\;\left({a}^{4} + \mathsf{fma}\left(2, {a}^{2} \cdot {b}^{2}, {b}^{4}\right)\right) - 1\\

\mathbf{else}:\\
\;\;\;\;\left({\left(\frac{1}{a}\right)}^{-4} + 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\\

\end{array}
double f(double a, double b) {
        double r153802 = a;
        double r153803 = r153802 * r153802;
        double r153804 = b;
        double r153805 = r153804 * r153804;
        double r153806 = r153803 + r153805;
        double r153807 = 2.0;
        double r153808 = pow(r153806, r153807);
        double r153809 = 4.0;
        double r153810 = 1.0;
        double r153811 = r153810 + r153802;
        double r153812 = r153803 * r153811;
        double r153813 = 3.0;
        double r153814 = r153813 * r153802;
        double r153815 = r153810 - r153814;
        double r153816 = r153805 * r153815;
        double r153817 = r153812 + r153816;
        double r153818 = r153809 * r153817;
        double r153819 = r153808 + r153818;
        double r153820 = r153819 - r153810;
        return r153820;
}

double f(double a, double b) {
        double r153821 = b;
        double r153822 = -0.0004706693102753827;
        bool r153823 = r153821 <= r153822;
        double r153824 = 2.006560387622814;
        bool r153825 = r153821 <= r153824;
        double r153826 = !r153825;
        bool r153827 = r153823 || r153826;
        double r153828 = a;
        double r153829 = 4.0;
        double r153830 = pow(r153828, r153829);
        double r153831 = 2.0;
        double r153832 = pow(r153828, r153831);
        double r153833 = pow(r153821, r153831);
        double r153834 = r153832 * r153833;
        double r153835 = pow(r153821, r153829);
        double r153836 = fma(r153831, r153834, r153835);
        double r153837 = r153830 + r153836;
        double r153838 = 1.0;
        double r153839 = r153837 - r153838;
        double r153840 = 1.0;
        double r153841 = r153840 / r153828;
        double r153842 = -4.0;
        double r153843 = pow(r153841, r153842);
        double r153844 = 4.0;
        double r153845 = r153828 * r153828;
        double r153846 = r153838 + r153828;
        double r153847 = r153845 * r153846;
        double r153848 = r153821 * r153821;
        double r153849 = 3.0;
        double r153850 = r153849 * r153828;
        double r153851 = r153838 - r153850;
        double r153852 = r153848 * r153851;
        double r153853 = r153847 + r153852;
        double r153854 = r153844 * r153853;
        double r153855 = r153843 + r153854;
        double r153856 = r153855 - r153838;
        double r153857 = r153827 ? r153839 : r153856;
        return r153857;
}

Error

Bits error versus a

Bits error versus b

Derivation

  1. Split input into 2 regimes
  2. if b < -0.0004706693102753827 or 2.006560387622814 < b

    1. Initial program 0.5

      \[\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. Taylor expanded around inf 3.1

      \[\leadsto \color{blue}{\left({a}^{4} + \left({b}^{4} + 2 \cdot \left({a}^{2} \cdot {b}^{2}\right)\right)\right)} - 1\]
    3. Simplified3.1

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

    if -0.0004706693102753827 < b < 2.006560387622814

    1. Initial program 0.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\]
    2. Taylor expanded around inf 0.4

      \[\leadsto \left(\color{blue}{{\left(\frac{1}{a}\right)}^{-4}} + 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\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.9

    \[\leadsto \begin{array}{l} \mathbf{if}\;b \le -4.70669310275382700610447006539516223711 \cdot 10^{-4} \lor \neg \left(b \le 2.006560387622814189967357378918677568436\right):\\ \;\;\;\;\left({a}^{4} + \mathsf{fma}\left(2, {a}^{2} \cdot {b}^{2}, {b}^{4}\right)\right) - 1\\ \mathbf{else}:\\ \;\;\;\;\left({\left(\frac{1}{a}\right)}^{-4} + 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\\ \end{array}\]

Reproduce

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