Average Error: 58.5 → 3.5
Time: 41.6s
Precision: 64
Internal Precision: 128
\[\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}\;b \le 3.1206474527261573 \cdot 10^{+252} \lor \neg \left(b \le 7.329126589161342 \cdot 10^{+307}\right):\\ \;\;\;\;\frac{1}{a} + \frac{1}{b}\\ \mathbf{else}:\\ \;\;\;\;\frac{(e^{\left(b + a\right) \cdot \varepsilon} - 1)^*}{(e^{\varepsilon \cdot b} - 1)^*} \cdot \frac{\varepsilon}{(e^{\varepsilon \cdot a} - 1)^*}\\ \end{array}\]

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.5
Target14.6
Herbie3.5
\[\frac{a + b}{a \cdot b}\]

Derivation

  1. Split input into 2 regimes
  2. if b < 3.1206474527261573e+252 or 7.329126589161342e+307 < b

    1. Initial program 58.9

      \[\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. Initial simplification28.4

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

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

    if 3.1206474527261573e+252 < b < 7.329126589161342e+307

    1. Initial program 46.5

      \[\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. Initial simplification15.9

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

      \[\leadsto \frac{\color{blue}{e^{\left(a + b\right) \cdot \varepsilon} - 1}}{(e^{\varepsilon \cdot b} - 1)^*} \cdot \frac{\varepsilon}{(e^{\varepsilon \cdot a} - 1)^*}\]
    4. Simplified15.9

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;b \le 3.1206474527261573 \cdot 10^{+252} \lor \neg \left(b \le 7.329126589161342 \cdot 10^{+307}\right):\\ \;\;\;\;\frac{1}{a} + \frac{1}{b}\\ \mathbf{else}:\\ \;\;\;\;\frac{(e^{\left(b + a\right) \cdot \varepsilon} - 1)^*}{(e^{\varepsilon \cdot b} - 1)^*} \cdot \frac{\varepsilon}{(e^{\varepsilon \cdot a} - 1)^*}\\ \end{array}\]

Reproduce

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

Details

Time bar (total: 17.8s)Debug log

start714.0ms

Algorithm
intervals

setup217.0ms

Pruning

1 alts after pruning (1 fresh and 0 done)

Merged error: 31.1b

localize25.0ms

Local error

Found 4 expressions with local error:

20.2b
(/ eps (expm1 (* eps a)))
12.2b
(/ (expm1 (* (+ a b) eps)) (expm1 (* eps b)))
5.4b
(* (/ (expm1 (* (+ a b) eps)) (expm1 (* eps b))) (/ eps (expm1 (* eps a))))
0.0b
(expm1 (* (+ a b) eps))

rewrite14.0ms

Algorithm
rewrite-expression-head
Counts
4 → 91
Calls

4 calls. Slowest were:

8.0ms
(* (/ (expm1 (* (+ a b) eps)) (expm1 (* eps b))) (/ eps (expm1 (* eps a))))
3.0ms
(/ (expm1 (* (+ a b) eps)) (expm1 (* eps b)))
1.0ms
(expm1 (* (+ a b) eps))

series606.0ms

Counts
4 → 12
Calls

4 calls. Slowest were:

439.0ms
(* (/ (expm1 (* (+ a b) eps)) (expm1 (* eps b))) (/ eps (expm1 (* eps a))))
74.0ms
(/ (expm1 (* (+ a b) eps)) (expm1 (* eps b)))
47.0ms
(expm1 (* (+ a b) eps))
46.0ms
(/ eps (expm1 (* eps a)))

simplify3.1s

Counts
67 → 103
Calls

67 calls. Slowest were:

496.0ms
(* (* (* (/ (expm1 (* (+ a b) eps)) (expm1 (* eps b))) (/ (expm1 (* (+ a b) eps)) (expm1 (* eps b)))) (/ (expm1 (* (+ a b) eps)) (expm1 (* eps b)))) (* (* (/ eps (expm1 (* eps a))) (/ eps (expm1 (* eps a)))) (/ eps (expm1 (* eps a)))))
400.0ms
(+ (- (log (expm1 (* (+ a b) eps))) (log (expm1 (* eps b)))) (log (/ eps (expm1 (* eps a)))))
258.0ms
(+ (log (/ (expm1 (* (+ a b) eps)) (expm1 (* eps b)))) (log (/ eps (expm1 (* eps a)))))

prune1.5s

Pruning

3 alts after pruning (3 fresh and 0 done)

Merged error: 0b

localize8.0ms

Local error

Found 1 expressions with local error:

0.0b
(+ (/ 1 a) (/ 1 b))

rewrite4.0ms

Algorithm
rewrite-expression-head
Counts
1 → 22
Calls

1 calls. Slowest were:

4.0ms
(+ (/ 1 a) (/ 1 b))

series7.0ms

Counts
1 → 3
Calls

1 calls. Slowest were:

7.0ms
(+ (/ 1 a) (/ 1 b))

simplify51.0ms

Counts
12 → 25
Calls

12 calls. Slowest were:

5.0ms
(+ (* 1 b) (* a 1))
5.0ms
(+ (/ 1 a) (/ 1 b))
5.0ms
(* (exp (/ 1 a)) (exp (/ 1 b)))

prune272.0ms

Pruning

3 alts after pruning (2 fresh and 1 done)

Merged error: 0b

localize17.0ms

Local error

Found 4 expressions with local error:

12.2b
(/ (expm1 (* (+ a b) eps)) (expm1 (* eps b)))
3.9b
(* (/ (expm1 (* (+ a b) eps)) (expm1 (* eps b))) (fma (fma 1/12 (* a eps) -1/2) eps (/ 1 a)))
0.1b
(fma 1/12 (* a eps) -1/2)
0.1b
(fma (fma 1/12 (* a eps) -1/2) eps (/ 1 a))

rewrite10.0ms

Algorithm
rewrite-expression-head
Counts
4 → 84
Calls

4 calls. Slowest were:

6.0ms
(* (/ (expm1 (* (+ a b) eps)) (expm1 (* eps b))) (fma (fma 1/12 (* a eps) -1/2) eps (/ 1 a)))
3.0ms
(/ (expm1 (* (+ a b) eps)) (expm1 (* eps b)))
0.0ms
(fma 1/12 (* a eps) -1/2)

series445.0ms

Counts
4 → 12
Calls

4 calls. Slowest were:

295.0ms
(* (/ (expm1 (* (+ a b) eps)) (expm1 (* eps b))) (fma (fma 1/12 (* a eps) -1/2) eps (/ 1 a)))
65.0ms
(/ (expm1 (* (+ a b) eps)) (expm1 (* eps b)))
52.0ms
(fma (fma 1/12 (* a eps) -1/2) eps (/ 1 a))
32.0ms
(fma 1/12 (* a eps) -1/2)

simplify2.9s

Counts
61 → 96
Calls

61 calls. Slowest were:

532.0ms
(* (expm1 (* (+ a b) eps)) (fma (fma 1/12 (* a eps) -1/2) eps (/ 1 a)))
279.0ms
(* (/ (expm1 (* (+ a b) eps)) (expm1 (* eps b))) (fma (fma 1/12 (* a eps) -1/2) eps (/ 1 a)))
184.0ms
(* (/ (* (* (expm1 (* (+ a b) eps)) (expm1 (* (+ a b) eps))) (expm1 (* (+ a b) eps))) (* (* (expm1 (* eps b)) (expm1 (* eps b))) (expm1 (* eps b)))) (* (* (fma (fma 1/12 (* a eps) -1/2) eps (/ 1 a)) (fma (fma 1/12 (* a eps) -1/2) eps (/ 1 a))) (fma (fma 1/12 (* a eps) -1/2) eps (/ 1 a))))

prune1.8s

Pruning

3 alts after pruning (1 fresh and 2 done)

Merged error: 0b

localize24.0ms

Local error

Found 4 expressions with local error:

20.2b
(/ eps (expm1 (* eps a)))
12.2b
(/ (expm1 (* (+ b a) eps)) (expm1 (* eps b)))
5.4b
(* (/ (expm1 (* (+ b a) eps)) (expm1 (* eps b))) (/ eps (expm1 (* eps a))))
0.0b
(expm1 (* (+ b a) eps))

rewrite20.0ms

Algorithm
rewrite-expression-head
Counts
4 → 91
Calls

4 calls. Slowest were:

11.0ms
(* (/ (expm1 (* (+ b a) eps)) (expm1 (* eps b))) (/ eps (expm1 (* eps a))))
6.0ms
(/ (expm1 (* (+ b a) eps)) (expm1 (* eps b)))
1.0ms
(/ eps (expm1 (* eps a)))

series651.0ms

Counts
4 → 12
Calls

4 calls. Slowest were:

462.0ms
(* (/ (expm1 (* (+ b a) eps)) (expm1 (* eps b))) (/ eps (expm1 (* eps a))))
92.0ms
(/ (expm1 (* (+ b a) eps)) (expm1 (* eps b)))
51.0ms
(/ eps (expm1 (* eps a)))
46.0ms
(expm1 (* (+ b a) eps))

simplify2.7s

Counts
67 → 103
Calls

67 calls. Slowest were:

414.0ms
(* (* (* (/ (expm1 (* (+ b a) eps)) (expm1 (* eps b))) (/ (expm1 (* (+ b a) eps)) (expm1 (* eps b)))) (/ (expm1 (* (+ b a) eps)) (expm1 (* eps b)))) (* (* (/ eps (expm1 (* eps a))) (/ eps (expm1 (* eps a)))) (/ eps (expm1 (* eps a)))))
356.0ms
(+ (- (log (expm1 (* (+ b a) eps))) (log (expm1 (* eps b)))) (log (/ eps (expm1 (* eps a)))))
230.0ms
(+ (log (/ (expm1 (* (+ b a) eps)) (expm1 (* eps b)))) (log (/ eps (expm1 (* eps a)))))

prune1.3s

Pruning

3 alts after pruning (0 fresh and 3 done)

Merged error: 0b

regimes458.0ms

Accuracy

-0.9% (3.4b remaining)

Error of 3.5b against oracle of 0.0b and baseline of 3.4b

bsearch988.0ms