Average Error: 39.9 → 0.9
Time: 11.8s
Precision: 64
Internal Precision: 128
\[\frac{e^{x}}{e^{x} - 1}\]
\[\begin{array}{l} \mathbf{if}\;\frac{e^{x}}{e^{x} - 1} \le 69.68789832406651:\\ \;\;\;\;\frac{e^{x}}{e^{x} - 1}\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{12} \cdot x + \left(\frac{1}{x} + \frac{1}{2}\right)\\ \end{array}\]

Error

Bits error versus x

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original39.9
Target39.4
Herbie0.9
\[\frac{1}{1 - e^{-x}}\]

Derivation

  1. Split input into 2 regimes
  2. if (/ (exp x) (- (exp x) 1)) < 69.68789832406651

    1. Initial program 1.4

      \[\frac{e^{x}}{e^{x} - 1}\]
    2. Taylor expanded around inf 1.4

      \[\leadsto \color{blue}{\frac{e^{x}}{e^{x} - 1}}\]

    if 69.68789832406651 < (/ (exp x) (- (exp x) 1))

    1. Initial program 61.4

      \[\frac{e^{x}}{e^{x} - 1}\]
    2. Taylor expanded around 0 0.7

      \[\leadsto \color{blue}{\frac{1}{12} \cdot x + \left(\frac{1}{x} + \frac{1}{2}\right)}\]
    3. Using strategy rm
    4. Applied +-commutative0.7

      \[\leadsto \frac{1}{12} \cdot x + \color{blue}{\left(\frac{1}{2} + \frac{1}{x}\right)}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.9

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{e^{x}}{e^{x} - 1} \le 69.68789832406651:\\ \;\;\;\;\frac{e^{x}}{e^{x} - 1}\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{12} \cdot x + \left(\frac{1}{x} + \frac{1}{2}\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2019005 
(FPCore (x)
  :name "expq2 (section 3.11)"

  :herbie-target
  (/ 1 (- 1 (exp (- x))))

  (/ (exp x) (- (exp x) 1)))

Details

Time bar (total: 11.2s)Debug log

sample113.0ms

Algorithm
intervals

simplify8.0ms

Counts
1 → 1
Calls

1 calls. Slowest were:

8.0ms
(/ (exp x) (- (exp x) 1))

prune8.0ms

Pruning

1 alts after pruning (1 fresh and 0 done)

Merged error: 39.9b

localize17.0ms

Local error

Found 2 expressions with local error:

4.5b
(- (exp x) 1)
0.3b
(/ (exp x) (- (exp x) 1))

rewrite18.0ms

Algorithm
rewrite-expression-head
Counts
2 → 45
Calls

2 calls. Slowest were:

11.0ms
(/ (exp x) (- (exp x) 1))
6.0ms
(- (exp x) 1)

series71.0ms

Counts
2 → 6
Calls

2 calls. Slowest were:

51.0ms
(/ (exp x) (- (exp x) 1))
20.0ms
(- (exp x) 1)

simplify716.0ms

Counts
41 → 51
Calls

41 calls. Slowest were:

275.0ms
(/ (* (* (exp x) (exp x)) (exp x)) (* (* (- (exp x) 1) (- (exp x) 1)) (- (exp x) 1)))
112.0ms
(+ x (+ (* 1/6 (pow x 3)) (* 1/2 (pow x 2))))
56.0ms
(+ (* (exp x) (exp x)) (+ (* 1 1) (* (exp x) 1)))

prune474.0ms

Pruning

6 alts after pruning (6 fresh and 0 done)

Merged error: 0.3b

localize31.0ms

Local error

Found 4 expressions with local error:

0.3b
(* x 1/6)
0.1b
(* (+ (* x 1/6) 1/2) (* x x))
0.0b
(+ x (* (+ (* x 1/6) 1/2) (* x x)))
0.0b
(/ (exp x) (+ x (* (+ (* x 1/6) 1/2) (* x x))))

rewrite11.0ms

Algorithm
rewrite-expression-head
Counts
4 → 64
Calls

4 calls. Slowest were:

5.0ms
(* (+ (* x 1/6) 1/2) (* x x))
3.0ms
(/ (exp x) (+ x (* (+ (* x 1/6) 1/2) (* x x))))
2.0ms
(+ x (* (+ (* x 1/6) 1/2) (* x x)))

series104.0ms

Counts
4 → 12
Calls

4 calls. Slowest were:

40.0ms
(* (+ (* x 1/6) 1/2) (* x x))
33.0ms
(/ (exp x) (+ x (* (+ (* x 1/6) 1/2) (* x x))))
23.0ms
(+ x (* (+ (* x 1/6) 1/2) (* x x)))
7.0ms
(* x 1/6)

simplify4.1s

Counts
46 → 76
Calls

46 calls. Slowest were:

503.0ms
(* (- (* (* x 1/6) (* x 1/6)) (* 1/2 1/2)) (* x x))
495.0ms
(* (+ (pow (* x 1/6) 3) (pow 1/2 3)) (* x x))
229.0ms
(- x (* (+ (* x 1/6) 1/2) (* x x)))

prune670.0ms

Pruning

6 alts after pruning (5 fresh and 1 done)

Merged error: 0.3b

localize21.0ms

Local error

Found 3 expressions with local error:

0.3b
(* 1/12 x)
0.0b
(+ (* 1/12 x) (+ (/ 1 x) 1/2))
0.0b
(+ (/ 1 x) 1/2)

rewrite18.0ms

Algorithm
rewrite-expression-head
Counts
3 → 30
Calls

3 calls. Slowest were:

13.0ms
(+ (* 1/12 x) (+ (/ 1 x) 1/2))
4.0ms
(+ (/ 1 x) 1/2)
0.0ms
(* 1/12 x)

series36.0ms

Counts
3 → 9
Calls

3 calls. Slowest were:

12.0ms
(+ (/ 1 x) 1/2)
12.0ms
(+ (* 1/12 x) (+ (/ 1 x) 1/2))
12.0ms
(* 1/12 x)

simplify83.0ms

Counts
10 → 39
Calls

10 calls. Slowest were:

40.0ms
(* (exp (* 1/12 x)) (exp (+ (/ 1 x) 1/2)))
10.0ms
(+ (* 1/12 x) (+ (/ 1 x) 1/2))
9.0ms
(+ (* 1/12 x) (+ (/ 1 x) 1/2))

prune344.0ms

Pruning

7 alts after pruning (6 fresh and 1 done)

Merged error: 0.3b

localize5.0ms

Local error

Found 3 expressions with local error:

0.3b
(* 1/12 x)
0.0b
(+ (* 1/12 x) (+ 1/2 (/ 1 x)))
0.0b
(+ 1/2 (/ 1 x))

rewrite7.0ms

Algorithm
rewrite-expression-head
Counts
3 → 30
Calls

3 calls. Slowest were:

5.0ms
(+ (* 1/12 x) (+ 1/2 (/ 1 x)))
1.0ms
(+ 1/2 (/ 1 x))
0.0ms
(* 1/12 x)

series28.0ms

Counts
3 → 9
Calls

3 calls. Slowest were:

12.0ms
(+ 1/2 (/ 1 x))
8.0ms
(+ (* 1/12 x) (+ 1/2 (/ 1 x)))
7.0ms
(* 1/12 x)

simplify101.0ms

Counts
11 → 39
Calls

11 calls. Slowest were:

45.0ms
(* (exp (* 1/12 x)) (exp (+ 1/2 (/ 1 x))))
17.0ms
(+ (* 1/12 x) (+ (/ 1 x) 1/2))
12.0ms
(+ (* 1/12 x) (+ (/ 1 x) 1/2))

prune280.0ms

Pruning

7 alts after pruning (5 fresh and 2 done)

Merged error: 0.3b

regimes176.0ms

Accuracy

26.6% (0.5b remaining)

Error of 0.9b against oracle of 0.4b and baseline of 1.1b

bsearch3.0ms

end0.0ms

sample3.7s

Algorithm
intervals