Average Error: 0.2 → 0.2
Time: 2.0s
Precision: 64
\[\left({\left(a \cdot a + b \cdot b\right)}^{2} + 4 \cdot \left(b \cdot b\right)\right) - 1\]
\[\mathsf{fma}\left(4 \cdot b, b, {\left(a \cdot a + b \cdot b\right)}^{2} - 1\right)\]
\left({\left(a \cdot a + b \cdot b\right)}^{2} + 4 \cdot \left(b \cdot b\right)\right) - 1
\mathsf{fma}\left(4 \cdot b, b, {\left(a \cdot a + b \cdot b\right)}^{2} - 1\right)
double f(double a, double b) {
        double r273842 = a;
        double r273843 = r273842 * r273842;
        double r273844 = b;
        double r273845 = r273844 * r273844;
        double r273846 = r273843 + r273845;
        double r273847 = 2.0;
        double r273848 = pow(r273846, r273847);
        double r273849 = 4.0;
        double r273850 = r273849 * r273845;
        double r273851 = r273848 + r273850;
        double r273852 = 1.0;
        double r273853 = r273851 - r273852;
        return r273853;
}

double f(double a, double b) {
        double r273854 = 4.0;
        double r273855 = b;
        double r273856 = r273854 * r273855;
        double r273857 = a;
        double r273858 = r273857 * r273857;
        double r273859 = r273855 * r273855;
        double r273860 = r273858 + r273859;
        double r273861 = 2.0;
        double r273862 = pow(r273860, r273861);
        double r273863 = 1.0;
        double r273864 = r273862 - r273863;
        double r273865 = fma(r273856, r273855, r273864);
        return r273865;
}

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(b \cdot b\right)\right) - 1\]
  2. Simplified0.2

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

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

Reproduce

herbie shell --seed 2020018 +o rules:numerics
(FPCore (a b)
  :name "Bouland and Aaronson, Equation (26)"
  :precision binary64
  (- (+ (pow (+ (* a a) (* b b)) 2) (* 4 (* b b))) 1))