\sin \left(x + \varepsilon\right) - \sin x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -8.0651460236276763 \cdot 10^{-9} \lor \neg \left(\varepsilon \le 3.1297217212623504 \cdot 10^{-9}\right):\\
\;\;\;\;\left(\sin x \cdot \cos \varepsilon + \cos x \cdot \sin \varepsilon\right) - \sin x\\
\mathbf{else}:\\
\;\;\;\;\left(\cos \left(\frac{\left(x + \varepsilon\right) + x}{2}\right) \cdot \sin \left(\frac{\varepsilon}{2}\right)\right) \cdot 2\\
\end{array}double f(double x, double eps) {
double r150391 = x;
double r150392 = eps;
double r150393 = r150391 + r150392;
double r150394 = sin(r150393);
double r150395 = sin(r150391);
double r150396 = r150394 - r150395;
return r150396;
}
double f(double x, double eps) {
double r150397 = eps;
double r150398 = -8.065146023627676e-09;
bool r150399 = r150397 <= r150398;
double r150400 = 3.1297217212623504e-09;
bool r150401 = r150397 <= r150400;
double r150402 = !r150401;
bool r150403 = r150399 || r150402;
double r150404 = x;
double r150405 = sin(r150404);
double r150406 = cos(r150397);
double r150407 = r150405 * r150406;
double r150408 = cos(r150404);
double r150409 = sin(r150397);
double r150410 = r150408 * r150409;
double r150411 = r150407 + r150410;
double r150412 = r150411 - r150405;
double r150413 = r150404 + r150397;
double r150414 = r150413 + r150404;
double r150415 = 2.0;
double r150416 = r150414 / r150415;
double r150417 = cos(r150416);
double r150418 = r150397 / r150415;
double r150419 = sin(r150418);
double r150420 = r150417 * r150419;
double r150421 = r150420 * r150415;
double r150422 = r150403 ? r150412 : r150421;
return r150422;
}




Bits error versus x




Bits error versus eps
Results
| Original | 37.1 |
|---|---|
| Target | 15.1 |
| Herbie | 0.4 |
if eps < -8.065146023627676e-09 or 3.1297217212623504e-09 < eps Initial program 29.9
rmApplied sin-sum0.6
if -8.065146023627676e-09 < eps < 3.1297217212623504e-09Initial program 44.8
rmApplied diff-sin44.8
Simplified0.3
Final simplification0.4
herbie shell --seed 2020042 +o rules:numerics
(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)))