Average Error: 60.0 → 3.7
Time: 14.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)}\]
\[\frac{1}{b} + \frac{1}{a}\]
\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)}
\frac{1}{b} + \frac{1}{a}
double f(double a, double b, double eps) {
        double r419 = eps;
        double r420 = a;
        double r421 = b;
        double r422 = r420 + r421;
        double r423 = r422 * r419;
        double r424 = exp(r423);
        double r425 = 1.0;
        double r426 = r424 - r425;
        double r427 = r419 * r426;
        double r428 = r420 * r419;
        double r429 = exp(r428);
        double r430 = r429 - r425;
        double r431 = r421 * r419;
        double r432 = exp(r431);
        double r433 = r432 - r425;
        double r434 = r430 * r433;
        double r435 = r427 / r434;
        return r435;
}

double f(double a, double b, double __attribute__((unused)) eps) {
        double r436 = 1.0;
        double r437 = b;
        double r438 = r436 / r437;
        double r439 = a;
        double r440 = r436 / r439;
        double r441 = r438 + r440;
        return r441;
}

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

Original60.0
Target15.4
Herbie3.7
\[\frac{a + b}{a \cdot b}\]

Derivation

  1. Initial program 60.0

    \[\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 3.7

    \[\leadsto \color{blue}{\frac{1}{b} + \frac{1}{a}}\]
  3. Final simplification3.7

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

Reproduce

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