Average Error: 0.2 → 0.2
Time: 5.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\]
\[\left(\mathsf{fma}\left({a}^{2}, \left(1 + a\right) \cdot 4, {\left(a \cdot a + b \cdot b\right)}^{2}\right) + 4 \cdot \left(\left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\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
\left(\mathsf{fma}\left({a}^{2}, \left(1 + a\right) \cdot 4, {\left(a \cdot a + b \cdot b\right)}^{2}\right) + 4 \cdot \left(\left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right)\right)\right) - 1
double f(double a, double b) {
        double r202912 = a;
        double r202913 = r202912 * r202912;
        double r202914 = b;
        double r202915 = r202914 * r202914;
        double r202916 = r202913 + r202915;
        double r202917 = 2.0;
        double r202918 = pow(r202916, r202917);
        double r202919 = 4.0;
        double r202920 = 1.0;
        double r202921 = r202920 + r202912;
        double r202922 = r202913 * r202921;
        double r202923 = 3.0;
        double r202924 = r202923 * r202912;
        double r202925 = r202920 - r202924;
        double r202926 = r202915 * r202925;
        double r202927 = r202922 + r202926;
        double r202928 = r202919 * r202927;
        double r202929 = r202918 + r202928;
        double r202930 = r202929 - r202920;
        return r202930;
}

double f(double a, double b) {
        double r202931 = a;
        double r202932 = 2.0;
        double r202933 = pow(r202931, r202932);
        double r202934 = 1.0;
        double r202935 = r202934 + r202931;
        double r202936 = 4.0;
        double r202937 = r202935 * r202936;
        double r202938 = r202931 * r202931;
        double r202939 = b;
        double r202940 = r202939 * r202939;
        double r202941 = r202938 + r202940;
        double r202942 = 2.0;
        double r202943 = pow(r202941, r202942);
        double r202944 = fma(r202933, r202937, r202943);
        double r202945 = 3.0;
        double r202946 = r202945 * r202931;
        double r202947 = r202934 - r202946;
        double r202948 = r202940 * r202947;
        double r202949 = r202936 * r202948;
        double r202950 = r202944 + r202949;
        double r202951 = r202950 - r202934;
        return r202951;
}

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 distribute-lft-in0.2

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

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

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

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

Reproduce

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