Average Error: 0.2 → 0.2
Time: 5.2s
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(\sqrt{{\left(a \cdot a + b \cdot b\right)}^{2}}, \sqrt{{\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({\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(\sqrt{{\left(a \cdot a + b \cdot b\right)}^{2}}, \sqrt{{\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
double f(double a, double b) {
        double r305041 = a;
        double r305042 = r305041 * r305041;
        double r305043 = b;
        double r305044 = r305043 * r305043;
        double r305045 = r305042 + r305044;
        double r305046 = 2.0;
        double r305047 = pow(r305045, r305046);
        double r305048 = 4.0;
        double r305049 = 1.0;
        double r305050 = r305049 + r305041;
        double r305051 = r305042 * r305050;
        double r305052 = 3.0;
        double r305053 = r305052 * r305041;
        double r305054 = r305049 - r305053;
        double r305055 = r305044 * r305054;
        double r305056 = r305051 + r305055;
        double r305057 = r305048 * r305056;
        double r305058 = r305047 + r305057;
        double r305059 = r305058 - r305049;
        return r305059;
}

double f(double a, double b) {
        double r305060 = a;
        double r305061 = r305060 * r305060;
        double r305062 = b;
        double r305063 = r305062 * r305062;
        double r305064 = r305061 + r305063;
        double r305065 = 2.0;
        double r305066 = pow(r305064, r305065);
        double r305067 = sqrt(r305066);
        double r305068 = 4.0;
        double r305069 = 1.0;
        double r305070 = r305069 + r305060;
        double r305071 = r305061 * r305070;
        double r305072 = 3.0;
        double r305073 = r305072 * r305060;
        double r305074 = r305069 - r305073;
        double r305075 = r305063 * r305074;
        double r305076 = r305071 + r305075;
        double r305077 = r305068 * r305076;
        double r305078 = fma(r305067, r305067, r305077);
        double r305079 = r305078 - r305069;
        return r305079;
}

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 add-sqr-sqrt0.2

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

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

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

Reproduce

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