\sin \left(x + \varepsilon\right) - \sin x
\begin{array}{l}
\mathbf{if}\;\varepsilon \leq -0.00023068637899912437 \lor \neg \left(\varepsilon \leq 1.2826844230892183 \cdot 10^{-5}\right):\\
\;\;\;\;\sin x \cdot \cos \varepsilon + \left(\sin \varepsilon \cdot \cos x - \sin x\right)\\
\mathbf{else}:\\
\;\;\;\;\varepsilon \cdot \left(-0.5 \cdot \left(\varepsilon \cdot \sin x\right)\right) + \cos x \cdot \left(\varepsilon + {\varepsilon}^{3} \cdot -0.16666666666666666\right)\\
\end{array}
(FPCore (x eps) :precision binary64 (- (sin (+ x eps)) (sin x)))
(FPCore (x eps)
:precision binary64
(if (or (<= eps -0.00023068637899912437) (not (<= eps 1.2826844230892183e-5)))
(+ (* (sin x) (cos eps)) (- (* (sin eps) (cos x)) (sin x)))
(+
(* eps (* -0.5 (* eps (sin x))))
(* (cos x) (+ eps (* (pow eps 3.0) -0.16666666666666666))))))double code(double x, double eps) {
return sin(x + eps) - sin(x);
}
double code(double x, double eps) {
double tmp;
if ((eps <= -0.00023068637899912437) || !(eps <= 1.2826844230892183e-5)) {
tmp = (sin(x) * cos(eps)) + ((sin(eps) * cos(x)) - sin(x));
} else {
tmp = (eps * (-0.5 * (eps * sin(x)))) + (cos(x) * (eps + (pow(eps, 3.0) * -0.16666666666666666)));
}
return tmp;
}




Bits error versus x




Bits error versus eps
Results
| Original | 37.0 |
|---|---|
| Target | 15.1 |
| Herbie | 0.3 |
if eps < -2.3068637899912437e-4 or 1.2826844230892183e-5 < eps Initial program 29.7
rmApplied sin-sum_binary640.4
Applied associate--l+_binary640.5
Simplified0.5
if -2.3068637899912437e-4 < eps < 1.2826844230892183e-5Initial program 44.8
Taylor expanded around 0 0.1
Simplified0.1
Final simplification0.3
herbie shell --seed 2021198
(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)))