\sin \left(x + \varepsilon\right) - \sin x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -0.008151886891035409199446348793571814894676 \lor \neg \left(\varepsilon \le 8.837665134522452590648921417169903147482 \cdot 10^{-9}\right):\\
\;\;\;\;\left(\sin x \cdot \cos \varepsilon + \cos x \cdot \sin \varepsilon\right) - \sin x\\
\mathbf{else}:\\
\;\;\;\;2 \cdot \left(\sin \left(\frac{\varepsilon}{2}\right) \cdot \cos \left(\frac{\left(x + \varepsilon\right) + x}{2}\right)\right)\\
\end{array}double f(double x, double eps) {
double r54404 = x;
double r54405 = eps;
double r54406 = r54404 + r54405;
double r54407 = sin(r54406);
double r54408 = sin(r54404);
double r54409 = r54407 - r54408;
return r54409;
}
double f(double x, double eps) {
double r54410 = eps;
double r54411 = -0.00815188689103541;
bool r54412 = r54410 <= r54411;
double r54413 = 8.837665134522453e-09;
bool r54414 = r54410 <= r54413;
double r54415 = !r54414;
bool r54416 = r54412 || r54415;
double r54417 = x;
double r54418 = sin(r54417);
double r54419 = cos(r54410);
double r54420 = r54418 * r54419;
double r54421 = cos(r54417);
double r54422 = sin(r54410);
double r54423 = r54421 * r54422;
double r54424 = r54420 + r54423;
double r54425 = r54424 - r54418;
double r54426 = 2.0;
double r54427 = r54410 / r54426;
double r54428 = sin(r54427);
double r54429 = r54417 + r54410;
double r54430 = r54429 + r54417;
double r54431 = r54430 / r54426;
double r54432 = cos(r54431);
double r54433 = r54428 * r54432;
double r54434 = r54426 * r54433;
double r54435 = r54416 ? r54425 : r54434;
return r54435;
}




Bits error versus x




Bits error versus eps
Results
| Original | 37.1 |
|---|---|
| Target | 15.2 |
| Herbie | 0.4 |
if eps < -0.00815188689103541 or 8.837665134522453e-09 < eps Initial program 30.3
rmApplied sin-sum0.4
if -0.00815188689103541 < eps < 8.837665134522453e-09Initial program 44.1
rmApplied diff-sin44.1
Simplified0.4
Final simplification0.4
herbie shell --seed 2019326
(FPCore (x eps)
:name "2sin (example 3.3)"
:precision binary64
:herbie-target
(* 2 (* (cos (+ x (/ eps 2))) (sin (/ eps 2))))
(- (sin (+ x eps)) (sin x)))