Average Error: 39.6 → 0.3
Time: 17.7s
Precision: binary64
Cost: 39040
\[\cos \left(x + \varepsilon\right) - \cos x \]
\[-\mathsf{fma}\left(\sin \varepsilon, \sin x, \left(\sin \varepsilon \cdot \tan \left(\frac{\varepsilon}{2}\right)\right) \cdot \cos x\right) \]
(FPCore (x eps) :precision binary64 (- (cos (+ x eps)) (cos x)))
(FPCore (x eps)
 :precision binary64
 (- (fma (sin eps) (sin x) (* (* (sin eps) (tan (/ eps 2.0))) (cos x)))))
double code(double x, double eps) {
	return cos((x + eps)) - cos(x);
}
double code(double x, double eps) {
	return -fma(sin(eps), sin(x), ((sin(eps) * tan((eps / 2.0))) * cos(x)));
}
function code(x, eps)
	return Float64(cos(Float64(x + eps)) - cos(x))
end
function code(x, eps)
	return Float64(-fma(sin(eps), sin(x), Float64(Float64(sin(eps) * tan(Float64(eps / 2.0))) * cos(x))))
end
code[x_, eps_] := N[(N[Cos[N[(x + eps), $MachinePrecision]], $MachinePrecision] - N[Cos[x], $MachinePrecision]), $MachinePrecision]
code[x_, eps_] := (-N[(N[Sin[eps], $MachinePrecision] * N[Sin[x], $MachinePrecision] + N[(N[(N[Sin[eps], $MachinePrecision] * N[Tan[N[(eps / 2.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision] * N[Cos[x], $MachinePrecision]), $MachinePrecision]), $MachinePrecision])
\cos \left(x + \varepsilon\right) - \cos x
-\mathsf{fma}\left(\sin \varepsilon, \sin x, \left(\sin \varepsilon \cdot \tan \left(\frac{\varepsilon}{2}\right)\right) \cdot \cos x\right)

Error

Derivation

  1. Initial program 39.6

    \[\cos \left(x + \varepsilon\right) - \cos x \]
  2. Applied egg-rr24.4

    \[\leadsto \color{blue}{\mathsf{fma}\left(\cos x, \cos \varepsilon, \left(-\sin x\right) \cdot \sin \varepsilon\right)} - \cos x \]
  3. Taylor expanded in x around inf 24.4

    \[\leadsto \color{blue}{\left(-1 \cdot \left(\sin x \cdot \sin \varepsilon\right) + \cos \varepsilon \cdot \cos x\right) - \cos x} \]
  4. Simplified6.2

    \[\leadsto \color{blue}{\mathsf{fma}\left(\sin x, -\sin \varepsilon, \left(\cos \varepsilon + -1\right) \cdot \cos x\right)} \]
    Proof
    (fma.f64 (sin.f64 x) (neg.f64 (sin.f64 eps)) (*.f64 (+.f64 (cos.f64 eps) -1) (cos.f64 x))): 0 points increase in error, 0 points decrease in error
    (fma.f64 (sin.f64 x) (neg.f64 (sin.f64 eps)) (*.f64 (+.f64 (cos.f64 eps) (Rewrite<= metadata-eval (neg.f64 1))) (cos.f64 x))): 0 points increase in error, 0 points decrease in error
    (fma.f64 (sin.f64 x) (neg.f64 (sin.f64 eps)) (*.f64 (Rewrite<= sub-neg_binary64 (-.f64 (cos.f64 eps) 1)) (cos.f64 x))): 0 points increase in error, 0 points decrease in error
    (fma.f64 (sin.f64 x) (neg.f64 (sin.f64 eps)) (Rewrite<= *-commutative_binary64 (*.f64 (cos.f64 x) (-.f64 (cos.f64 eps) 1)))): 0 points increase in error, 0 points decrease in error
    (fma.f64 (sin.f64 x) (neg.f64 (sin.f64 eps)) (*.f64 (cos.f64 x) (Rewrite=> sub-neg_binary64 (+.f64 (cos.f64 eps) (neg.f64 1))))): 0 points increase in error, 0 points decrease in error
    (fma.f64 (sin.f64 x) (neg.f64 (sin.f64 eps)) (*.f64 (cos.f64 x) (+.f64 (cos.f64 eps) (Rewrite=> metadata-eval -1)))): 0 points increase in error, 0 points decrease in error
    (fma.f64 (sin.f64 x) (neg.f64 (sin.f64 eps)) (Rewrite<= distribute-rgt-out_binary64 (+.f64 (*.f64 (cos.f64 eps) (cos.f64 x)) (*.f64 -1 (cos.f64 x))))): 10 points increase in error, 11 points decrease in error
    (fma.f64 (sin.f64 x) (neg.f64 (sin.f64 eps)) (+.f64 (Rewrite<= *-commutative_binary64 (*.f64 (cos.f64 x) (cos.f64 eps))) (*.f64 -1 (cos.f64 x)))): 0 points increase in error, 0 points decrease in error
    (fma.f64 (sin.f64 x) (neg.f64 (sin.f64 eps)) (+.f64 (*.f64 (cos.f64 x) (cos.f64 eps)) (Rewrite<= neg-mul-1_binary64 (neg.f64 (cos.f64 x))))): 0 points increase in error, 0 points decrease in error
    (fma.f64 (sin.f64 x) (neg.f64 (sin.f64 eps)) (Rewrite<= sub-neg_binary64 (-.f64 (*.f64 (cos.f64 x) (cos.f64 eps)) (cos.f64 x)))): 0 points increase in error, 0 points decrease in error
    (Rewrite<= fma-def_binary64 (+.f64 (*.f64 (sin.f64 x) (neg.f64 (sin.f64 eps))) (-.f64 (*.f64 (cos.f64 x) (cos.f64 eps)) (cos.f64 x)))): 13 points increase in error, 4 points decrease in error
    (+.f64 (Rewrite<= distribute-rgt-neg-in_binary64 (neg.f64 (*.f64 (sin.f64 x) (sin.f64 eps)))) (-.f64 (*.f64 (cos.f64 x) (cos.f64 eps)) (cos.f64 x))): 0 points increase in error, 0 points decrease in error
    (+.f64 (Rewrite<= mul-1-neg_binary64 (*.f64 -1 (*.f64 (sin.f64 x) (sin.f64 eps)))) (-.f64 (*.f64 (cos.f64 x) (cos.f64 eps)) (cos.f64 x))): 0 points increase in error, 0 points decrease in error
    (+.f64 (*.f64 -1 (*.f64 (sin.f64 x) (sin.f64 eps))) (-.f64 (Rewrite=> *-commutative_binary64 (*.f64 (cos.f64 eps) (cos.f64 x))) (cos.f64 x))): 0 points increase in error, 0 points decrease in error
    (Rewrite<= associate--l+_binary64 (-.f64 (+.f64 (*.f64 -1 (*.f64 (sin.f64 x) (sin.f64 eps))) (*.f64 (cos.f64 eps) (cos.f64 x))) (cos.f64 x))): 94 points increase in error, 18 points decrease in error
  5. Applied egg-rr0.6

    \[\leadsto \mathsf{fma}\left(\sin x, -\sin \varepsilon, \color{blue}{\frac{{\sin \varepsilon}^{2}}{-1 - \cos \varepsilon}} \cdot \cos x\right) \]
  6. Taylor expanded in x around inf 0.6

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

    \[\leadsto \color{blue}{-\mathsf{fma}\left(\sin \varepsilon, \sin x, \left(\tan \left(\frac{\varepsilon}{2}\right) \cdot \sin \varepsilon\right) \cdot \cos x\right)} \]
    Proof
    (neg.f64 (fma.f64 (sin.f64 eps) (sin.f64 x) (*.f64 (*.f64 (tan.f64 (/.f64 eps 2)) (sin.f64 eps)) (cos.f64 x)))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (fma.f64 (sin.f64 eps) (sin.f64 x) (*.f64 (*.f64 (Rewrite<= hang-0p-tan_binary64 (/.f64 (sin.f64 eps) (+.f64 1 (cos.f64 eps)))) (sin.f64 eps)) (cos.f64 x)))): 40 points increase in error, 7 points decrease in error
    (neg.f64 (fma.f64 (sin.f64 eps) (sin.f64 x) (*.f64 (Rewrite<= associate-/r/_binary64 (/.f64 (sin.f64 eps) (/.f64 (+.f64 1 (cos.f64 eps)) (sin.f64 eps)))) (cos.f64 x)))): 31 points increase in error, 14 points decrease in error
    (neg.f64 (fma.f64 (sin.f64 eps) (sin.f64 x) (*.f64 (Rewrite<= associate-/l*_binary64 (/.f64 (*.f64 (sin.f64 eps) (sin.f64 eps)) (+.f64 1 (cos.f64 eps)))) (cos.f64 x)))): 18 points increase in error, 25 points decrease in error
    (neg.f64 (fma.f64 (sin.f64 eps) (sin.f64 x) (*.f64 (/.f64 (Rewrite<= unpow2_binary64 (pow.f64 (sin.f64 eps) 2)) (+.f64 1 (cos.f64 eps))) (cos.f64 x)))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (fma.f64 (sin.f64 eps) (sin.f64 x) (Rewrite=> associate-*l/_binary64 (/.f64 (*.f64 (pow.f64 (sin.f64 eps) 2) (cos.f64 x)) (+.f64 1 (cos.f64 eps)))))): 9 points increase in error, 6 points decrease in error
    (neg.f64 (fma.f64 (sin.f64 eps) (sin.f64 x) (/.f64 (Rewrite<= *-commutative_binary64 (*.f64 (cos.f64 x) (pow.f64 (sin.f64 eps) 2))) (+.f64 1 (cos.f64 eps))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (fma.f64 (sin.f64 eps) (sin.f64 x) (Rewrite<= remove-double-neg_binary64 (neg.f64 (neg.f64 (/.f64 (*.f64 (cos.f64 x) (pow.f64 (sin.f64 eps) 2)) (+.f64 1 (cos.f64 eps)))))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (fma.f64 (sin.f64 eps) (sin.f64 x) (neg.f64 (Rewrite<= mul-1-neg_binary64 (*.f64 -1 (/.f64 (*.f64 (cos.f64 x) (pow.f64 (sin.f64 eps) 2)) (+.f64 1 (cos.f64 eps)))))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (Rewrite<= fma-neg_binary64 (-.f64 (*.f64 (sin.f64 eps) (sin.f64 x)) (*.f64 -1 (/.f64 (*.f64 (cos.f64 x) (pow.f64 (sin.f64 eps) 2)) (+.f64 1 (cos.f64 eps))))))): 11 points increase in error, 7 points decrease in error
    (neg.f64 (-.f64 (Rewrite<= *-commutative_binary64 (*.f64 (sin.f64 x) (sin.f64 eps))) (*.f64 -1 (/.f64 (*.f64 (cos.f64 x) (pow.f64 (sin.f64 eps) 2)) (+.f64 1 (cos.f64 eps)))))): 0 points increase in error, 0 points decrease in error
    (Rewrite<= sub0-neg_binary64 (-.f64 0 (-.f64 (*.f64 (sin.f64 x) (sin.f64 eps)) (*.f64 -1 (/.f64 (*.f64 (cos.f64 x) (pow.f64 (sin.f64 eps) 2)) (+.f64 1 (cos.f64 eps))))))): 0 points increase in error, 0 points decrease in error
    (Rewrite<= associate-+l-_binary64 (+.f64 (-.f64 0 (*.f64 (sin.f64 x) (sin.f64 eps))) (*.f64 -1 (/.f64 (*.f64 (cos.f64 x) (pow.f64 (sin.f64 eps) 2)) (+.f64 1 (cos.f64 eps)))))): 0 points increase in error, 0 points decrease in error
    (+.f64 (Rewrite<= neg-sub0_binary64 (neg.f64 (*.f64 (sin.f64 x) (sin.f64 eps)))) (*.f64 -1 (/.f64 (*.f64 (cos.f64 x) (pow.f64 (sin.f64 eps) 2)) (+.f64 1 (cos.f64 eps))))): 0 points increase in error, 0 points decrease in error
    (+.f64 (Rewrite<= mul-1-neg_binary64 (*.f64 -1 (*.f64 (sin.f64 x) (sin.f64 eps)))) (*.f64 -1 (/.f64 (*.f64 (cos.f64 x) (pow.f64 (sin.f64 eps) 2)) (+.f64 1 (cos.f64 eps))))): 0 points increase in error, 0 points decrease in error
  8. Final simplification0.3

    \[\leadsto -\mathsf{fma}\left(\sin \varepsilon, \sin x, \left(\sin \varepsilon \cdot \tan \left(\frac{\varepsilon}{2}\right)\right) \cdot \cos x\right) \]

Alternatives

Alternative 1
Error0.5
Cost32776
\[\begin{array}{l} t_0 := \mathsf{fma}\left(\sin x, -\sin \varepsilon, \cos x \cdot \left(\cos \varepsilon + -1\right)\right)\\ \mathbf{if}\;x \leq -0.015377057109550571:\\ \;\;\;\;t_0\\ \mathbf{elif}\;x \leq 6.186411156651901 \cdot 10^{-22}:\\ \;\;\;\;\left(\sin \varepsilon \cdot \tan \left(\frac{\varepsilon}{2}\right)\right) \cdot \left(-1 + 0.5 \cdot \left(x \cdot x\right)\right) - \sin \varepsilon \cdot x\\ \mathbf{else}:\\ \;\;\;\;t_0\\ \end{array} \]
Alternative 2
Error0.5
Cost26440
\[\begin{array}{l} t_0 := \cos x \cdot \left(\cos \varepsilon + -1\right) - \sin \varepsilon \cdot \sin x\\ \mathbf{if}\;x \leq -0.015377057109550571:\\ \;\;\;\;t_0\\ \mathbf{elif}\;x \leq 6.186411156651901 \cdot 10^{-22}:\\ \;\;\;\;\left(\sin \varepsilon \cdot \tan \left(\frac{\varepsilon}{2}\right)\right) \cdot \left(-1 + 0.5 \cdot \left(x \cdot x\right)\right) - \sin \varepsilon \cdot x\\ \mathbf{else}:\\ \;\;\;\;t_0\\ \end{array} \]
Alternative 3
Error15.2
Cost13888
\[\left(\sin \left(0.5 \cdot \left(\varepsilon + \left(x - x\right)\right)\right) \cdot \sin \left(0.5 \cdot \left(x + \left(\varepsilon + x\right)\right)\right)\right) \cdot -2 \]
Alternative 4
Error15.3
Cost13768
\[\begin{array}{l} t_0 := -2 \cdot \left(\sin x \cdot \sin \left(0.5 \cdot \left(\varepsilon + \left(x - x\right)\right)\right)\right)\\ \mathbf{if}\;x \leq -547188.37384759:\\ \;\;\;\;t_0\\ \mathbf{elif}\;x \leq 8.798873554713465 \cdot 10^{-8}:\\ \;\;\;\;\sin \varepsilon \cdot \left(\left(-x\right) - \tan \left(\frac{\varepsilon}{2}\right)\right)\\ \mathbf{else}:\\ \;\;\;\;t_0\\ \end{array} \]
Alternative 5
Error15.4
Cost13640
\[\begin{array}{l} \mathbf{if}\;\varepsilon \leq -8661182162451.163:\\ \;\;\;\;\cos \varepsilon - \cos x\\ \mathbf{elif}\;\varepsilon \leq 3.223341072942121 \cdot 10^{-5}:\\ \;\;\;\;\varepsilon \cdot \left(\cos x \cdot \left(\varepsilon \cdot -0.5\right) - \sin x\right)\\ \mathbf{else}:\\ \;\;\;\;-2 \cdot {\sin \left(\varepsilon \cdot 0.5\right)}^{2}\\ \end{array} \]
Alternative 6
Error16.5
Cost13576
\[\begin{array}{l} t_0 := \varepsilon \cdot \left(-\sin x\right)\\ \mathbf{if}\;x \leq -547188.37384759:\\ \;\;\;\;t_0\\ \mathbf{elif}\;x \leq 8.798873554713465 \cdot 10^{-8}:\\ \;\;\;\;\sin \varepsilon \cdot \left(\left(-x\right) - \tan \left(\frac{\varepsilon}{2}\right)\right)\\ \mathbf{else}:\\ \;\;\;\;t_0\\ \end{array} \]
Alternative 7
Error21.2
Cost13448
\[\begin{array}{l} t_0 := -2 \cdot {\sin \left(\varepsilon \cdot 0.5\right)}^{2}\\ \mathbf{if}\;\varepsilon \leq -2.474576117401579 \cdot 10^{-44}:\\ \;\;\;\;t_0\\ \mathbf{elif}\;\varepsilon \leq 6.531877774805346 \cdot 10^{-75}:\\ \;\;\;\;\varepsilon \cdot \left(-\sin x\right)\\ \mathbf{else}:\\ \;\;\;\;t_0\\ \end{array} \]
Alternative 8
Error20.9
Cost13124
\[\begin{array}{l} \mathbf{if}\;\varepsilon \leq -3.563137615429812 \cdot 10^{-10}:\\ \;\;\;\;\cos \varepsilon - \cos x\\ \mathbf{elif}\;\varepsilon \leq 3.223341072942121 \cdot 10^{-5}:\\ \;\;\;\;\varepsilon \cdot \left(-\sin x\right)\\ \mathbf{else}:\\ \;\;\;\;\cos \varepsilon + -1\\ \end{array} \]
Alternative 9
Error21.1
Cost6920
\[\begin{array}{l} t_0 := \cos \varepsilon + -1\\ \mathbf{if}\;\varepsilon \leq -3.563137615429812 \cdot 10^{-10}:\\ \;\;\;\;t_0\\ \mathbf{elif}\;\varepsilon \leq 3.223341072942121 \cdot 10^{-5}:\\ \;\;\;\;\varepsilon \cdot \left(-\sin x\right)\\ \mathbf{else}:\\ \;\;\;\;t_0\\ \end{array} \]
Alternative 10
Error35.5
Cost6856
\[\begin{array}{l} t_0 := \cos \varepsilon + -1\\ \mathbf{if}\;\varepsilon \leq -8661182162451.163:\\ \;\;\;\;t_0\\ \mathbf{elif}\;\varepsilon \leq 9.950379857852202 \cdot 10^{-49}:\\ \;\;\;\;\varepsilon \cdot \left(\varepsilon \cdot -0.5\right)\\ \mathbf{else}:\\ \;\;\;\;t_0\\ \end{array} \]
Alternative 11
Error50.8
Cost320
\[\varepsilon \cdot \left(\varepsilon \cdot -0.5\right) \]

Error

Reproduce

herbie shell --seed 2022291 
(FPCore (x eps)
  :name "2cos (problem 3.3.5)"
  :precision binary64
  (- (cos (+ x eps)) (cos x)))