\sin \left(x + \varepsilon\right) - \sin x
\begin{array}{l}
\mathbf{if}\;\varepsilon \leq -0.0009986885707327965:\\
\;\;\;\;\left(\sin x \cdot \cos \varepsilon + \cos x \cdot \sin \varepsilon\right) - \sin x\\
\mathbf{elif}\;\varepsilon \leq 0.0007460669567238816:\\
\;\;\;\;2 \cdot \left(\sin \left(\frac{\varepsilon}{2}\right) \cdot \left(\cos x + \varepsilon \cdot \left(\sin x \cdot \left(-0.5 + \left(\varepsilon \cdot \varepsilon\right) \cdot 0.020833333333333332\right) - \varepsilon \cdot \left(\cos x \cdot 0.125\right)\right)\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\sin x \cdot \cos \varepsilon + \left(\cos x \cdot \sin \varepsilon - \sin x\right)\\
\end{array}(FPCore (x eps) :precision binary64 (- (sin (+ x eps)) (sin x)))
(FPCore (x eps)
:precision binary64
(if (<= eps -0.0009986885707327965)
(- (+ (* (sin x) (cos eps)) (* (cos x) (sin eps))) (sin x))
(if (<= eps 0.0007460669567238816)
(*
2.0
(*
(sin (/ eps 2.0))
(+
(cos x)
(*
eps
(-
(* (sin x) (+ -0.5 (* (* eps eps) 0.020833333333333332)))
(* eps (* (cos x) 0.125)))))))
(+ (* (sin x) (cos eps)) (- (* (cos x) (sin eps)) (sin x))))))double code(double x, double eps) {
return sin(x + eps) - sin(x);
}
double code(double x, double eps) {
double tmp;
if (eps <= -0.0009986885707327965) {
tmp = ((sin(x) * cos(eps)) + (cos(x) * sin(eps))) - sin(x);
} else if (eps <= 0.0007460669567238816) {
tmp = 2.0 * (sin(eps / 2.0) * (cos(x) + (eps * ((sin(x) * (-0.5 + ((eps * eps) * 0.020833333333333332))) - (eps * (cos(x) * 0.125))))));
} else {
tmp = (sin(x) * cos(eps)) + ((cos(x) * sin(eps)) - sin(x));
}
return tmp;
}













Bits error versus x













Bits error versus eps
Results
| Original | 36.8 |
|---|---|
| Target | 14.9 |
| Herbie | 0.3 |
| Alternative 1 | |
|---|---|
| Error | 0.3 |
| Cost | 32904 |
| Alternative 2 | |
|---|---|
| Error | 15.0 |
| Cost | 13632 |
| Alternative 3 | |
|---|---|
| Error | 14.9 |
| Cost | 13504 |
| Alternative 4 | |
|---|---|
| Error | 14.7 |
| Cost | 39688 |
| Alternative 5 | |
|---|---|
| Error | 14.6 |
| Cost | 13320 |
| Alternative 6 | |
|---|---|
| Error | 15.0 |
| Cost | 6920 |
| Alternative 7 | |
|---|---|
| Error | 28.6 |
| Cost | 6464 |
| Alternative 8 | |
|---|---|
| Error | 42.7 |
| Cost | 706 |
| Alternative 9 | |
|---|---|
| Error | 45.2 |
| Cost | 64 |

if eps < -9.9868857073279649e-4Initial program 30.2
rmApplied pow1_binary64_184430.2
rmApplied sin-sum_binary64_19160.4
Simplified0.4
if -9.9868857073279649e-4 < eps < 7.4606695672388163e-4Initial program 44.0
rmApplied diff-sin_binary64_193344.0
Simplified0.5
Taylor expanded around 0 0.1
Simplified0.1
Simplified0.1
if 7.4606695672388163e-4 < eps Initial program 29.2
rmApplied sin-sum_binary64_19160.4
Applied associate--l+_binary64_17200.4
Simplified0.4
Final simplification0.3
herbie shell --seed 2021014
(FPCore (x eps)
:name "2sin (example 3.3)"
:precision binary64
:herbie-target
(* 2.0 (* (cos (+ x (/ eps 2.0))) (sin (/ eps 2.0))))
(- (sin (+ x eps)) (sin x)))