Average Error: 58.8 → 2.9
Time: 46.2s
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 3.532032554393501 \cdot 10^{-54}:\\ \;\;\;\;\frac{1}{b} + \frac{1}{a}\\ \mathbf{else}:\\ \;\;\;\;\frac{\varepsilon \cdot \frac{\mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(b \cdot \varepsilon\right)}}{\mathsf{expm1}\left(\varepsilon \cdot a\right)}\\ \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 3.532032554393501 \cdot 10^{-54}:\\
\;\;\;\;\frac{1}{b} + \frac{1}{a}\\

\mathbf{else}:\\
\;\;\;\;\frac{\varepsilon \cdot \frac{\mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(b \cdot \varepsilon\right)}}{\mathsf{expm1}\left(\varepsilon \cdot a\right)}\\

\end{array}
double f(double a, double b, double eps) {
        double r3538588 = eps;
        double r3538589 = a;
        double r3538590 = b;
        double r3538591 = r3538589 + r3538590;
        double r3538592 = r3538591 * r3538588;
        double r3538593 = exp(r3538592);
        double r3538594 = 1.0;
        double r3538595 = r3538593 - r3538594;
        double r3538596 = r3538588 * r3538595;
        double r3538597 = r3538589 * r3538588;
        double r3538598 = exp(r3538597);
        double r3538599 = r3538598 - r3538594;
        double r3538600 = r3538590 * r3538588;
        double r3538601 = exp(r3538600);
        double r3538602 = r3538601 - r3538594;
        double r3538603 = r3538599 * r3538602;
        double r3538604 = r3538596 / r3538603;
        return r3538604;
}

double f(double a, double b, double eps) {
        double r3538605 = eps;
        double r3538606 = 3.532032554393501e-54;
        bool r3538607 = r3538605 <= r3538606;
        double r3538608 = 1.0;
        double r3538609 = b;
        double r3538610 = r3538608 / r3538609;
        double r3538611 = a;
        double r3538612 = r3538608 / r3538611;
        double r3538613 = r3538610 + r3538612;
        double r3538614 = r3538611 + r3538609;
        double r3538615 = r3538614 * r3538605;
        double r3538616 = expm1(r3538615);
        double r3538617 = r3538609 * r3538605;
        double r3538618 = expm1(r3538617);
        double r3538619 = r3538616 / r3538618;
        double r3538620 = r3538605 * r3538619;
        double r3538621 = r3538605 * r3538611;
        double r3538622 = expm1(r3538621);
        double r3538623 = r3538620 / r3538622;
        double r3538624 = r3538607 ? r3538613 : r3538623;
        return r3538624;
}

Error

Bits error versus a

Bits error versus b

Bits error versus eps

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original58.8
Target13.6
Herbie2.9
\[\frac{a + b}{a \cdot b}\]

Derivation

  1. Split input into 2 regimes
  2. if eps < 3.532032554393501e-54

    1. Initial program 59.3

      \[\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. Simplified28.8

      \[\leadsto \color{blue}{\frac{\frac{\varepsilon}{\mathsf{expm1}\left(\varepsilon \cdot b\right)} \cdot \mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(\varepsilon \cdot a\right)}}\]
    3. Taylor expanded around 0 2.7

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

    if 3.532032554393501e-54 < eps

    1. Initial program 51.6

      \[\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. Simplified5.3

      \[\leadsto \color{blue}{\frac{\frac{\varepsilon}{\mathsf{expm1}\left(\varepsilon \cdot b\right)} \cdot \mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(\varepsilon \cdot a\right)}}\]
    3. Using strategy rm
    4. Applied div-inv6.2

      \[\leadsto \frac{\color{blue}{\left(\varepsilon \cdot \frac{1}{\mathsf{expm1}\left(\varepsilon \cdot b\right)}\right)} \cdot \mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(\varepsilon \cdot a\right)}\]
    5. Applied associate-*l*6.2

      \[\leadsto \frac{\color{blue}{\varepsilon \cdot \left(\frac{1}{\mathsf{expm1}\left(\varepsilon \cdot b\right)} \cdot \mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)\right)}}{\mathsf{expm1}\left(\varepsilon \cdot a\right)}\]
    6. Simplified5.5

      \[\leadsto \frac{\varepsilon \cdot \color{blue}{\frac{\mathsf{expm1}\left(\varepsilon \cdot \left(b + a\right)\right)}{\mathsf{expm1}\left(\varepsilon \cdot b\right)}}}{\mathsf{expm1}\left(\varepsilon \cdot a\right)}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification2.9

    \[\leadsto \begin{array}{l} \mathbf{if}\;\varepsilon \le 3.532032554393501 \cdot 10^{-54}:\\ \;\;\;\;\frac{1}{b} + \frac{1}{a}\\ \mathbf{else}:\\ \;\;\;\;\frac{\varepsilon \cdot \frac{\mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(b \cdot \varepsilon\right)}}{\mathsf{expm1}\left(\varepsilon \cdot a\right)}\\ \end{array}\]

Reproduce

herbie shell --seed 2019144 +o rules:numerics
(FPCore (a b eps)
  :name "expq3 (problem 3.4.2)"
  :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))))