Average Error: 60.4 → 4.8
Time: 9.3s
Precision: 64
\[-1 \lt \varepsilon \land \varepsilon \lt 1\]
\[\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \left(e^{b \cdot \varepsilon} - 1\right)}\]
\[\begin{array}{l} \mathbf{if}\;\varepsilon \le 5.3360736243582115 \cdot 10^{-31}:\\ \;\;\;\;\frac{1}{b} + \frac{1}{a}\\ \mathbf{else}:\\ \;\;\;\;\frac{\varepsilon}{\frac{e^{\mathsf{fma}\left(a, \varepsilon, \varepsilon \cdot b\right)} + \left(1 - \mathsf{fma}\left(1, e^{\varepsilon \cdot b}, 1 \cdot e^{a \cdot \varepsilon}\right)\right)}{e^{\left(a + b\right) \cdot \varepsilon} - 1}}\\ \end{array}\]
\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \left(e^{b \cdot \varepsilon} - 1\right)}
\begin{array}{l}
\mathbf{if}\;\varepsilon \le 5.3360736243582115 \cdot 10^{-31}:\\
\;\;\;\;\frac{1}{b} + \frac{1}{a}\\

\mathbf{else}:\\
\;\;\;\;\frac{\varepsilon}{\frac{e^{\mathsf{fma}\left(a, \varepsilon, \varepsilon \cdot b\right)} + \left(1 - \mathsf{fma}\left(1, e^{\varepsilon \cdot b}, 1 \cdot e^{a \cdot \varepsilon}\right)\right)}{e^{\left(a + b\right) \cdot \varepsilon} - 1}}\\

\end{array}
double f(double a, double b, double eps) {
        double r84970 = eps;
        double r84971 = a;
        double r84972 = b;
        double r84973 = r84971 + r84972;
        double r84974 = r84973 * r84970;
        double r84975 = exp(r84974);
        double r84976 = 1.0;
        double r84977 = r84975 - r84976;
        double r84978 = r84970 * r84977;
        double r84979 = r84971 * r84970;
        double r84980 = exp(r84979);
        double r84981 = r84980 - r84976;
        double r84982 = r84972 * r84970;
        double r84983 = exp(r84982);
        double r84984 = r84983 - r84976;
        double r84985 = r84981 * r84984;
        double r84986 = r84978 / r84985;
        return r84986;
}

double f(double a, double b, double eps) {
        double r84987 = eps;
        double r84988 = 5.3360736243582115e-31;
        bool r84989 = r84987 <= r84988;
        double r84990 = 1.0;
        double r84991 = b;
        double r84992 = r84990 / r84991;
        double r84993 = a;
        double r84994 = r84990 / r84993;
        double r84995 = r84992 + r84994;
        double r84996 = r84987 * r84991;
        double r84997 = fma(r84993, r84987, r84996);
        double r84998 = exp(r84997);
        double r84999 = 1.0;
        double r85000 = exp(r84996);
        double r85001 = r84993 * r84987;
        double r85002 = exp(r85001);
        double r85003 = r84999 * r85002;
        double r85004 = fma(r84999, r85000, r85003);
        double r85005 = r84999 - r85004;
        double r85006 = r84998 + r85005;
        double r85007 = r84993 + r84991;
        double r85008 = r85007 * r84987;
        double r85009 = exp(r85008);
        double r85010 = r85009 - r84999;
        double r85011 = r85006 / r85010;
        double r85012 = r84987 / r85011;
        double r85013 = r84989 ? r84995 : r85012;
        return r85013;
}

Error

Bits error versus a

Bits error versus b

Bits error versus eps

Target

Original60.4
Target14.6
Herbie4.8
\[\frac{a + b}{a \cdot b}\]

Derivation

  1. Split input into 2 regimes
  2. if eps < 5.3360736243582115e-31

    1. Initial program 60.8

      \[\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \left(e^{b \cdot \varepsilon} - 1\right)}\]
    2. Taylor expanded around 0 2.9

      \[\leadsto \color{blue}{\frac{1}{b} + \frac{1}{a}}\]

    if 5.3360736243582115e-31 < eps

    1. Initial program 50.7

      \[\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \left(e^{b \cdot \varepsilon} - 1\right)}\]
    2. Taylor expanded around inf 55.1

      \[\leadsto \color{blue}{\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(e^{a \cdot \varepsilon} \cdot e^{\varepsilon \cdot b} + 1\right) - \left(1 \cdot e^{\varepsilon \cdot b} + 1 \cdot e^{a \cdot \varepsilon}\right)}}\]
    3. Simplified50.7

      \[\leadsto \color{blue}{\frac{\varepsilon}{\frac{e^{\mathsf{fma}\left(a, \varepsilon, \varepsilon \cdot b\right)} + \left(1 - \mathsf{fma}\left(1, e^{\varepsilon \cdot b}, 1 \cdot e^{a \cdot \varepsilon}\right)\right)}{e^{\left(a + b\right) \cdot \varepsilon} - 1}}}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification4.8

    \[\leadsto \begin{array}{l} \mathbf{if}\;\varepsilon \le 5.3360736243582115 \cdot 10^{-31}:\\ \;\;\;\;\frac{1}{b} + \frac{1}{a}\\ \mathbf{else}:\\ \;\;\;\;\frac{\varepsilon}{\frac{e^{\mathsf{fma}\left(a, \varepsilon, \varepsilon \cdot b\right)} + \left(1 - \mathsf{fma}\left(1, e^{\varepsilon \cdot b}, 1 \cdot e^{a \cdot \varepsilon}\right)\right)}{e^{\left(a + b\right) \cdot \varepsilon} - 1}}\\ \end{array}\]

Reproduce

herbie shell --seed 2020046 +o rules:numerics
(FPCore (a b eps)
  :name "expq3 (problem 3.4.2)"
  :precision binary64
  :pre (and (< -1 eps) (< eps 1))

  :herbie-target
  (/ (+ a b) (* a b))

  (/ (* eps (- (exp (* (+ a b) eps)) 1)) (* (- (exp (* a eps)) 1) (- (exp (* b eps)) 1))))