Average Error: 39.1 → 0.2
Time: 11.2s
Precision: 64
Internal Precision: 128
\[\log \left(1 + x\right)\]
\[\begin{array}{l} \mathbf{if}\;x \le 0.00014110950786400104:\\ \;\;\;\;x + \left(x \cdot x\right) \cdot \left(\frac{1}{3} \cdot x - \frac{1}{2}\right)\\ \mathbf{else}:\\ \;\;\;\;\left(\log \left(\sqrt{\sqrt{x + 1}}\right) + \log \left(\sqrt{\sqrt{x + 1}}\right)\right) + \log \left(x + 1\right) \cdot \frac{1}{2}\\ \end{array}\]

Error

Bits error versus x

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original39.1
Target0.2
Herbie0.2
\[\begin{array}{l} \mathbf{if}\;1 + x = 1:\\ \;\;\;\;x\\ \mathbf{else}:\\ \;\;\;\;\frac{x \cdot \log \left(1 + x\right)}{\left(1 + x\right) - 1}\\ \end{array}\]

Derivation

  1. Split input into 2 regimes
  2. if x < 0.00014110950786400104

    1. Initial program 58.9

      \[\log \left(1 + x\right)\]
    2. Taylor expanded around 0 0.2

      \[\leadsto \color{blue}{\left(x + \frac{1}{3} \cdot {x}^{3}\right) - \frac{1}{2} \cdot {x}^{2}}\]
    3. Simplified0.2

      \[\leadsto \color{blue}{\left(x \cdot \frac{1}{3} - \frac{1}{2}\right) \cdot \left(x \cdot x\right) + x}\]

    if 0.00014110950786400104 < x

    1. Initial program 0.1

      \[\log \left(1 + x\right)\]
    2. Using strategy rm
    3. Applied add-sqr-sqrt0.1

      \[\leadsto \log \color{blue}{\left(\sqrt{1 + x} \cdot \sqrt{1 + x}\right)}\]
    4. Applied log-prod0.1

      \[\leadsto \color{blue}{\log \left(\sqrt{1 + x}\right) + \log \left(\sqrt{1 + x}\right)}\]
    5. Using strategy rm
    6. Applied add-sqr-sqrt0.1

      \[\leadsto \log \left(\sqrt{1 + x}\right) + \log \color{blue}{\left(\sqrt{\sqrt{1 + x}} \cdot \sqrt{\sqrt{1 + x}}\right)}\]
    7. Applied log-prod0.1

      \[\leadsto \log \left(\sqrt{1 + x}\right) + \color{blue}{\left(\log \left(\sqrt{\sqrt{1 + x}}\right) + \log \left(\sqrt{\sqrt{1 + x}}\right)\right)}\]
    8. Using strategy rm
    9. Applied pow1/20.1

      \[\leadsto \log \color{blue}{\left({\left(1 + x\right)}^{\frac{1}{2}}\right)} + \left(\log \left(\sqrt{\sqrt{1 + x}}\right) + \log \left(\sqrt{\sqrt{1 + x}}\right)\right)\]
    10. Applied log-pow0.1

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;x \le 0.00014110950786400104:\\ \;\;\;\;x + \left(x \cdot x\right) \cdot \left(\frac{1}{3} \cdot x - \frac{1}{2}\right)\\ \mathbf{else}:\\ \;\;\;\;\left(\log \left(\sqrt{\sqrt{x + 1}}\right) + \log \left(\sqrt{\sqrt{x + 1}}\right)\right) + \log \left(x + 1\right) \cdot \frac{1}{2}\\ \end{array}\]

Reproduce

herbie shell --seed 2019004 
(FPCore (x)
  :name "ln(1 + x)"

  :herbie-target
  (if (== (+ 1 x) 1) x (/ (* x (log (+ 1 x))) (- (+ 1 x) 1)))

  (log (+ 1 x)))

Details

Time bar (total: 10.6s)Debug log

sample132.0ms

Algorithm
intervals

simplify4.0ms

Counts
1 → 1
Calls

1 calls. Slowest were:

4.0ms
(log (+ 1 x))

prune8.0ms

Pruning

1 alts after pruning (1 fresh and 0 done)

Merged error: 35.2b

localize24.0ms

Local error

Found 1 expressions with local error:

2.8b
(log (+ 1 x))

rewrite2.0ms

Algorithm
rewrite-expression-head
Counts
1 → 14
Calls

1 calls. Slowest were:

1.0ms
(log (+ 1 x))

series36.0ms

Counts
1 → 3
Calls

1 calls. Slowest were:

36.0ms
(log (+ 1 x))

simplify488.0ms

Counts
9 → 17
Calls

9 calls. Slowest were:

246.0ms
(- (+ (/ 1 x) (log -1)) (+ (log (/ -1 x)) (* 1/2 (/ 1 (pow x 2)))))
122.0ms
(- (/ 1 x) (+ (log (/ 1 x)) (* 1/2 (/ 1 (pow x 2)))))
106.0ms
(- (+ x (* 1/3 (pow x 3))) (* 1/2 (pow x 2)))

prune128.0ms

Pruning

5 alts after pruning (5 fresh and 0 done)

Merged error: 0.1b

localize23.0ms

Local error

Found 2 expressions with local error:

0.4b
(* x 1/3)
0.1b
(* (- (* x 1/3) 1/2) (* x x))

rewrite10.0ms

Algorithm
rewrite-expression-head
Counts
2 → 25
Calls

2 calls. Slowest were:

9.0ms
(* (- (* x 1/3) 1/2) (* x x))
0.0ms
(* x 1/3)

series36.0ms

Counts
2 → 6
Calls

2 calls. Slowest were:

29.0ms
(* (- (* x 1/3) 1/2) (* x x))
7.0ms
(* x 1/3)

simplify1.5s

Counts
13 → 31
Calls

13 calls. Slowest were:

492.0ms
(* (- (pow (* x 1/3) 3) (pow 1/2 3)) (* x x))
468.0ms
(* (- (* (* x 1/3) (* x 1/3)) (* 1/2 1/2)) (* x x))
396.0ms
(* (* (* (- (* x 1/3) 1/2) (- (* x 1/3) 1/2)) (- (* x 1/3) 1/2)) (* (* (* x x) (* x x)) (* x x)))

prune211.0ms

Pruning

5 alts after pruning (4 fresh and 1 done)

Merged error: 0.1b

localize8.0ms

Local error

Found 4 expressions with local error:

2.8b
(log (sqrt (+ 1 x)))
2.8b
(log (sqrt (+ 1 x)))
0.0b
(sqrt (+ 1 x))
0.0b
(sqrt (+ 1 x))

rewrite4.0ms

Algorithm
rewrite-expression-head
Counts
4 → 64
Calls

4 calls. Slowest were:

1.0ms
(log (sqrt (+ 1 x)))
1.0ms
(log (sqrt (+ 1 x)))
1.0ms
(sqrt (+ 1 x))

series87.0ms

Counts
4 → 12
Calls

4 calls. Slowest were:

34.0ms
(log (sqrt (+ 1 x)))
28.0ms
(log (sqrt (+ 1 x)))
14.0ms
(sqrt (+ 1 x))
11.0ms
(sqrt (+ 1 x))

simplify463.0ms

Counts
42 → 76
Calls

42 calls. Slowest were:

132.0ms
(- (+ (* 1/2 x) (* 1/6 (pow x 3))) (* 1/4 (pow x 2)))
100.0ms
(- (+ (* 1/2 x) (* 1/6 (pow x 3))) (* 1/4 (pow x 2)))
73.0ms
(- (+ (* 1/2 x) 1) (* 1/8 (pow x 2)))

prune686.0ms

Pruning

5 alts after pruning (4 fresh and 1 done)

Merged error: 0.1b

localize11.0ms

Local error

Found 4 expressions with local error:

2.9b
(log (sqrt (sqrt (+ 1 x))))
2.9b
(log (sqrt (sqrt (+ 1 x))))
2.8b
(log (sqrt (+ 1 x)))
0.1b
(sqrt (sqrt (+ 1 x)))

rewrite6.0ms

Algorithm
rewrite-expression-head
Counts
4 → 78
Calls

4 calls. Slowest were:

2.0ms
(log (sqrt (sqrt (+ 1 x))))
2.0ms
(log (sqrt (sqrt (+ 1 x))))
1.0ms
(log (sqrt (+ 1 x)))

series203.0ms

Counts
4 → 12
Calls

4 calls. Slowest were:

61.0ms
(log (sqrt (sqrt (+ 1 x))))
56.0ms
(log (sqrt (sqrt (+ 1 x))))
44.0ms
(sqrt (sqrt (+ 1 x)))
41.0ms
(log (sqrt (+ 1 x)))

simplify1.4s

Counts
55 → 90
Calls

55 calls. Slowest were:

203.0ms
(- (+ (* 1/4 (/ 1 x)) (* 1/4 (log -1))) (+ (* 1/4 (log (/ -1 x))) (* 1/8 (/ 1 (pow x 2)))))
196.0ms
(- (+ (* 1/4 (/ (exp (* 1/4 (- (log -1) (log (/ -1 x))))) x)) (exp (* 1/4 (- (log -1) (log (/ -1 x)))))) (* 3/32 (/ (exp (* 1/4 (- (log -1) (log (/ -1 x))))) (pow x 2))))
194.0ms
(- (+ (* 1/4 (/ 1 x)) (* 1/4 (log -1))) (+ (* 1/4 (log (/ -1 x))) (* 1/8 (/ 1 (pow x 2)))))

prune893.0ms

Pruning

5 alts after pruning (3 fresh and 2 done)

Merged error: 0.1b

regimes148.0ms

Accuracy

99.5% (0.1b remaining)

Error of 0.2b against oracle of 0.1b and baseline of 20.7b

bsearch49.0ms

end0.0ms

sample4.0s

Algorithm
intervals