Average Error: 40.1 → 0.7
Time: 19.4s
Precision: 64
Internal Precision: 128
\[\cos \left(x + \varepsilon\right) - \cos x\]
\[\begin{array}{l} \mathbf{if}\;\varepsilon \le -6.030207407183357 \cdot 10^{-05} \lor \neg \left(\varepsilon \le 4.096802796851688 \cdot 10^{-05}\right):\\ \;\;\;\;\cos \varepsilon \cdot \cos x - \left(\cos x + \sin \varepsilon \cdot \sin x\right)\\ \mathbf{else}:\\ \;\;\;\;\log_* (1 + (e^{-2 \cdot \left(\sin \left(\frac{\varepsilon}{2}\right) \cdot \sin \left(\frac{\left(x + x\right) + \varepsilon}{2}\right)\right)} - 1)^*)\\ \end{array}\]

Error

Bits error versus x

Bits error versus eps

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Derivation

  1. Split input into 2 regimes
  2. if eps < -6.030207407183357e-05 or 4.096802796851688e-05 < eps

    1. Initial program 30.9

      \[\cos \left(x + \varepsilon\right) - \cos x\]
    2. Initial simplification30.9

      \[\leadsto \cos \left(\varepsilon + x\right) - \cos x\]
    3. Using strategy rm
    4. Applied cos-sum0.9

      \[\leadsto \color{blue}{\left(\cos \varepsilon \cdot \cos x - \sin \varepsilon \cdot \sin x\right)} - \cos x\]
    5. Applied associate--l-0.9

      \[\leadsto \color{blue}{\cos \varepsilon \cdot \cos x - \left(\sin \varepsilon \cdot \sin x + \cos x\right)}\]

    if -6.030207407183357e-05 < eps < 4.096802796851688e-05

    1. Initial program 49.3

      \[\cos \left(x + \varepsilon\right) - \cos x\]
    2. Initial simplification49.3

      \[\leadsto \cos \left(\varepsilon + x\right) - \cos x\]
    3. Using strategy rm
    4. Applied diff-cos37.8

      \[\leadsto \color{blue}{-2 \cdot \left(\sin \left(\frac{\left(\varepsilon + x\right) - x}{2}\right) \cdot \sin \left(\frac{\left(\varepsilon + x\right) + x}{2}\right)\right)}\]
    5. Simplified0.5

      \[\leadsto -2 \cdot \color{blue}{\left(\sin \left(\frac{\left(x + x\right) + \varepsilon}{2}\right) \cdot \sin \left(\frac{\varepsilon}{2}\right)\right)}\]
    6. Using strategy rm
    7. Applied log1p-expm1-u0.5

      \[\leadsto \color{blue}{\log_* (1 + (e^{-2 \cdot \left(\sin \left(\frac{\left(x + x\right) + \varepsilon}{2}\right) \cdot \sin \left(\frac{\varepsilon}{2}\right)\right)} - 1)^*)}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.7

    \[\leadsto \begin{array}{l} \mathbf{if}\;\varepsilon \le -6.030207407183357 \cdot 10^{-05} \lor \neg \left(\varepsilon \le 4.096802796851688 \cdot 10^{-05}\right):\\ \;\;\;\;\cos \varepsilon \cdot \cos x - \left(\cos x + \sin \varepsilon \cdot \sin x\right)\\ \mathbf{else}:\\ \;\;\;\;\log_* (1 + (e^{-2 \cdot \left(\sin \left(\frac{\varepsilon}{2}\right) \cdot \sin \left(\frac{\left(x + x\right) + \varepsilon}{2}\right)\right)} - 1)^*)\\ \end{array}\]

Reproduce

herbie shell --seed 2018362 +o rules:numerics
(FPCore (x eps)
  :name "2cos (problem 3.3.5)"
  (- (cos (+ x eps)) (cos x)))

Details

Time bar (total: 9.1s)Debug log

start195.0ms

Algorithm
intervals

setup11.0ms

Pruning

1 alts after pruning (1 fresh and 0 done)

Merged error: 39.6b

localize16.0ms

Local error

Found 2 expressions with local error:

3.1b
(cos (+ eps x))
2.0b
(- (cos (+ eps x)) (cos x))

rewrite10.0ms

Algorithm
rewrite-expression-head
Counts
2 → 40
Calls

2 calls. Slowest were:

7.0ms
(- (cos (+ eps x)) (cos x))
2.0ms
(cos (+ eps x))

series90.0ms

Counts
2 → 6
Calls

2 calls. Slowest were:

68.0ms
(- (cos (+ eps x)) (cos x))
22.0ms
(cos (+ eps x))

simplify702.0ms

Counts
33 → 46
Calls

33 calls. Slowest were:

166.0ms
(- (* 1/24 (pow eps 4)) (+ (* x eps) (* 1/2 (pow eps 2))))
125.0ms
(- 1 (+ (* x eps) (* 1/2 (pow eps 2))))
41.0ms
(fma (sqrt (cos (+ eps x))) (sqrt (cos (+ eps x))) (- (* (sqrt (cos x)) (sqrt (cos x)))))

prune498.0ms

Pruning

7 alts after pruning (7 fresh and 0 done)

Merged error: 0.2b

localize47.0ms

Local error

Found 3 expressions with local error:

3.1b
(sin (/ (+ (+ x x) eps) 2))
0.2b
(* (sin (/ (+ (+ x x) eps) 2)) (sin (/ eps 2)))
0.0b
(* -2 (* (sin (/ (+ (+ x x) eps) 2)) (sin (/ eps 2))))

rewrite29.0ms

Algorithm
rewrite-expression-head
Counts
3 → 41
Calls

3 calls. Slowest were:

11.0ms
(sin (/ (+ (+ x x) eps) 2))
9.0ms
(* (sin (/ (+ (+ x x) eps) 2)) (sin (/ eps 2)))
9.0ms
(* -2 (* (sin (/ (+ (+ x x) eps) 2)) (sin (/ eps 2))))

series206.0ms

Counts
3 → 9
Calls

3 calls. Slowest were:

97.0ms
(* -2 (* (sin (/ (+ (+ x x) eps) 2)) (sin (/ eps 2))))
77.0ms
(* (sin (/ (+ (+ x x) eps) 2)) (sin (/ eps 2)))
31.0ms
(sin (/ (+ (+ x x) eps) 2))

simplify1.2s

Counts
19 → 50
Calls

19 calls. Slowest were:

454.0ms
(- (+ (* 1/4 (pow eps 2)) (* 1/2 (* x eps))) (* 1/12 (* (pow x 3) eps)))
252.0ms
(- (* 1/6 (* (pow x 3) eps)) (+ (* 1/2 (pow eps 2)) (* x eps)))
155.0ms
(- (+ x (* 1/2 eps)) (* 1/6 (pow x 3)))

prune664.0ms

Pruning

10 alts after pruning (9 fresh and 1 done)

Merged error: 0.2b

localize10.0ms

Local error

Found 4 expressions with local error:

3.1b
(sin (/ (+ (+ x x) eps) 2))
0.2b
(* (sin (/ (+ (+ x x) eps) 2)) (sin (/ eps 2)))
0.1b
(log1p (expm1 (* -2 (* (sin (/ (+ (+ x x) eps) 2)) (sin (/ eps 2))))))
0.1b
(expm1 (* -2 (* (sin (/ (+ (+ x x) eps) 2)) (sin (/ eps 2)))))

rewrite30.0ms

Algorithm
rewrite-expression-head
Counts
4 → 51
Calls

4 calls. Slowest were:

19.0ms
(* (sin (/ (+ (+ x x) eps) 2)) (sin (/ eps 2)))
9.0ms
(sin (/ (+ (+ x x) eps) 2))
1.0ms
(expm1 (* -2 (* (sin (/ (+ (+ x x) eps) 2)) (sin (/ eps 2)))))

series528.0ms

Counts
4 → 12
Calls

4 calls. Slowest were:

217.0ms
(expm1 (* -2 (* (sin (/ (+ (+ x x) eps) 2)) (sin (/ eps 2)))))
200.0ms
(log1p (expm1 (* -2 (* (sin (/ (+ (+ x x) eps) 2)) (sin (/ eps 2))))))
83.0ms
(* (sin (/ (+ (+ x x) eps) 2)) (sin (/ eps 2)))
27.0ms
(sin (/ (+ (+ x x) eps) 2))

simplify1.3s

Counts
22 → 63
Calls

22 calls. Slowest were:

340.0ms
(- (+ (* 1/4 (pow eps 2)) (* 1/2 (* x eps))) (* 1/12 (* (pow x 3) eps)))
309.0ms
(- (* 1/6 (* (pow x 3) eps)) (+ (* 1/2 (pow eps 2)) (* x eps)))
228.0ms
(- (* 1/6 (* (pow x 3) eps)) (+ (* 1/2 (pow eps 2)) (* x eps)))

prune853.0ms

Pruning

10 alts after pruning (8 fresh and 2 done)

Merged error: 0.2b

localize24.0ms

Local error

Found 4 expressions with local error:

3.1b
(sin (/ (+ (+ x x) eps) 2))
0.6b
(cbrt (sin (/ eps 2)))
0.6b
(cbrt (sin (/ eps 2)))
0.6b
(cbrt (sin (/ eps 2)))

rewrite9.0ms

Algorithm
rewrite-expression-head
Counts
4 → 48
Calls

4 calls. Slowest were:

6.0ms
(sin (/ (+ (+ x x) eps) 2))
1.0ms
(cbrt (sin (/ eps 2)))
1.0ms
(cbrt (sin (/ eps 2)))

series537.0ms

Counts
4 → 12
Calls

4 calls. Slowest were:

188.0ms
(cbrt (sin (/ eps 2)))
176.0ms
(cbrt (sin (/ eps 2)))
152.0ms
(cbrt (sin (/ eps 2)))
21.0ms
(sin (/ (+ (+ x x) eps) 2))

simplify631.0ms

Counts
21 → 60
Calls

21 calls. Slowest were:

146.0ms
(- (exp (* 1/3 (+ (log 1/2) (log eps)))) (+ (* 1/51840 (* (exp (* 1/3 (+ (log 1/2) (log eps)))) (pow eps 4))) (* 1/72 (* (exp (* 1/3 (+ (log 1/2) (log eps)))) (pow eps 2)))))
135.0ms
(- (exp (* 1/3 (+ (log 1/2) (log eps)))) (+ (* 1/51840 (* (exp (* 1/3 (+ (log 1/2) (log eps)))) (pow eps 4))) (* 1/72 (* (exp (* 1/3 (+ (log 1/2) (log eps)))) (pow eps 2)))))
126.0ms
(- (+ x (* 1/2 eps)) (* 1/6 (pow x 3)))

prune1.0s

Pruning

10 alts after pruning (7 fresh and 3 done)

Merged error: 0.2b

regimes246.0ms

Accuracy

97.8% (0.3b remaining)

Error of 0.7b against oracle of 0.4b and baseline of 15.3b

bsearch231.0ms