Average Error: 40.1 → 0.7
Time: 18.8s
Precision: 64
Internal Precision: 128
\[\cos \left(x + \varepsilon\right) - \cos x\]
\[\begin{array}{l} \mathbf{if}\;\varepsilon \le -0.017159707841805674 \lor \neg \left(\varepsilon \le 2.1517152137045746 \cdot 10^{-05}\right):\\ \;\;\;\;\cos \varepsilon \cdot \cos x - \left(\cos x + \sin \varepsilon \cdot \sin x\right)\\ \mathbf{else}:\\ \;\;\;\;\sin \left(\frac{\varepsilon}{2}\right) \cdot \left(-2 \cdot (e^{\log_* (1 + \sin \left(\frac{\left(x + x\right) + \varepsilon}{2}\right))} - 1)^*\right)\\ \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 < -0.017159707841805674 or 2.1517152137045746e-05 < eps

    1. Initial program 30.0

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

      \[\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 -0.017159707841805674 < eps < 2.1517152137045746e-05

    1. Initial program 50.3

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

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

      \[\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.6

      \[\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 associate-*r*0.5

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

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

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

Reproduce

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

Details

Time bar (total: 8.5s)Debug log

start204.0ms

Algorithm
intervals

setup11.0ms

Pruning

1 alts after pruning (1 fresh and 0 done)

Merged error: 36.1b

localize13.0ms

Local error

Found 2 expressions with local error:

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

rewrite7.0ms

Algorithm
rewrite-expression-head
Counts
2 → 40
Calls

2 calls. Slowest were:

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

series121.0ms

Counts
2 → 6
Calls

2 calls. Slowest were:

105.0ms
(- (cos (+ eps x)) (cos x))
16.0ms
(cos (+ eps x))

simplify801.0ms

Counts
33 → 46
Calls

33 calls. Slowest were:

178.0ms
(- (* 1/24 (pow eps 4)) (+ (* x eps) (* 1/2 (pow eps 2))))
155.0ms
(- 1 (+ (* x eps) (* 1/2 (pow eps 2))))
33.0ms
(fma 1 (cos (+ eps x)) (- (* (cos x) 1)))

prune432.0ms

Pruning

10 alts after pruning (10 fresh and 0 done)

Merged error: 0.3b

localize46.0ms

Local error

Found 3 expressions with local error:

3.5b
(sin (/ (+ (+ x x) eps) 2))
0.3b
(* (sin (/ (+ (+ x x) eps) 2)) (sin (/ eps 2)))
0.0b
(* -2 (* (sin (/ (+ (+ x x) eps) 2)) (sin (/ eps 2))))

rewrite49.0ms

Algorithm
rewrite-expression-head
Counts
3 → 41
Calls

3 calls. Slowest were:

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

series236.0ms

Counts
3 → 9
Calls

3 calls. Slowest were:

103.0ms
(* (sin (/ (+ (+ x x) eps) 2)) (sin (/ eps 2)))
99.0ms
(* -2 (* (sin (/ (+ (+ x x) eps) 2)) (sin (/ eps 2))))
34.0ms
(sin (/ (+ (+ x x) eps) 2))

simplify1.1s

Counts
19 → 50
Calls

19 calls. Slowest were:

511.0ms
(- (* 1/6 (* (pow x 3) eps)) (+ (* 1/2 (pow eps 2)) (* x eps)))
311.0ms
(- (+ (* 1/4 (pow eps 2)) (* 1/2 (* x eps))) (* 1/12 (* (pow x 3) eps)))
80.0ms
(- (+ x (* 1/2 eps)) (* 1/6 (pow x 3)))

prune710.0ms

Pruning

14 alts after pruning (14 fresh and 0 done)

Merged error: 0.3b

localize6.0ms

Local error

Found 2 expressions with local error:

3.5b
(sin (/ (+ (+ x x) eps) 2))
0.3b
(* (* -2 (sin (/ (+ (+ x x) eps) 2))) (sin (/ eps 2)))

rewrite38.0ms

Algorithm
rewrite-expression-head
Counts
2 → 26
Calls

2 calls. Slowest were:

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

series117.0ms

Counts
2 → 6
Calls

2 calls. Slowest were:

82.0ms
(* (* -2 (sin (/ (+ (+ x x) eps) 2))) (sin (/ eps 2)))
35.0ms
(sin (/ (+ (+ x x) eps) 2))

simplify950.0ms

Counts
12 → 32
Calls

12 calls. Slowest were:

477.0ms
(- (* 1/6 (* (pow x 3) eps)) (+ (* 1/2 (pow eps 2)) (* x eps)))
256.0ms
(* (* (* (* -2 (sin (/ (+ (+ x x) eps) 2))) (* -2 (sin (/ (+ (+ x x) eps) 2)))) (* -2 (sin (/ (+ (+ x x) eps) 2)))) (* (* (sin (/ eps 2)) (sin (/ eps 2))) (sin (/ eps 2))))
89.0ms
(- (+ x (* 1/2 eps)) (* 1/6 (pow x 3)))

prune583.0ms

Pruning

13 alts after pruning (13 fresh and 0 done)

Merged error: 0.3b

localize15.0ms

Local error

Found 4 expressions with local error:

3.5b
(sin (/ (+ (+ x x) eps) 2))
0.3b
(* (* -2 (log1p (expm1 (sin (/ (+ (+ x x) eps) 2))))) (sin (/ eps 2)))
0.3b
(log1p (expm1 (sin (/ (+ (+ x x) eps) 2))))
0.2b
(expm1 (sin (/ (+ (+ x x) eps) 2)))

rewrite21.0ms

Algorithm
rewrite-expression-head
Counts
4 → 48
Calls

4 calls. Slowest were:

12.0ms
(* (* -2 (log1p (expm1 (sin (/ (+ (+ x x) eps) 2))))) (sin (/ eps 2)))
8.0ms
(sin (/ (+ (+ x x) eps) 2))
1.0ms
(expm1 (sin (/ (+ (+ x x) eps) 2)))

series369.0ms

Counts
4 → 12
Calls

4 calls. Slowest were:

200.0ms
(* (* -2 (log1p (expm1 (sin (/ (+ (+ x x) eps) 2))))) (sin (/ eps 2)))
80.0ms
(log1p (expm1 (sin (/ (+ (+ x x) eps) 2))))
53.0ms
(expm1 (sin (/ (+ (+ x x) eps) 2)))
36.0ms
(sin (/ (+ (+ x x) eps) 2))

simplify1.3s

Counts
20 → 60
Calls

20 calls. Slowest were:

518.0ms
(- (* 1/6 (* (pow x 3) eps)) (+ (* 1/2 (pow eps 2)) (* x eps)))
239.0ms
(* (* (* (* -2 (log1p (expm1 (sin (/ (+ (+ x x) eps) 2))))) (* -2 (log1p (expm1 (sin (/ (+ (+ x x) eps) 2)))))) (* -2 (log1p (expm1 (sin (/ (+ (+ x x) eps) 2)))))) (* (* (sin (/ eps 2)) (sin (/ eps 2))) (sin (/ eps 2))))
150.0ms
(- (+ x (* 1/2 eps)) (* 1/6 (pow x 3)))

prune804.0ms

Pruning

12 alts after pruning (12 fresh and 0 done)

Merged error: 0.3b

regimes204.0ms

Accuracy

97.3% (0.4b remaining)

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

bsearch301.0ms