\sin \left(x + \varepsilon\right) - \sin x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -6.83922365147160498477619820149701890255 \cdot 10^{-9} \lor \neg \left(\varepsilon \le 7.263195155747593821712365094725644999729 \cdot 10^{-12}\right):\\
\;\;\;\;\sin x \cdot \cos \varepsilon + \left(\cos x \cdot \sin \varepsilon - \sin x\right)\\
\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 r96495 = x;
double r96496 = eps;
double r96497 = r96495 + r96496;
double r96498 = sin(r96497);
double r96499 = sin(r96495);
double r96500 = r96498 - r96499;
return r96500;
}
double f(double x, double eps) {
double r96501 = eps;
double r96502 = -6.839223651471605e-09;
bool r96503 = r96501 <= r96502;
double r96504 = 7.263195155747594e-12;
bool r96505 = r96501 <= r96504;
double r96506 = !r96505;
bool r96507 = r96503 || r96506;
double r96508 = x;
double r96509 = sin(r96508);
double r96510 = cos(r96501);
double r96511 = r96509 * r96510;
double r96512 = cos(r96508);
double r96513 = sin(r96501);
double r96514 = r96512 * r96513;
double r96515 = r96514 - r96509;
double r96516 = r96511 + r96515;
double r96517 = 2.0;
double r96518 = r96501 / r96517;
double r96519 = sin(r96518);
double r96520 = r96508 + r96501;
double r96521 = r96520 + r96508;
double r96522 = r96521 / r96517;
double r96523 = cos(r96522);
double r96524 = r96519 * r96523;
double r96525 = r96517 * r96524;
double r96526 = r96507 ? r96516 : r96525;
return r96526;
}




Bits error versus x




Bits error versus eps
Results
| Original | 36.6 |
|---|---|
| Target | 14.8 |
| Herbie | 0.4 |
if eps < -6.839223651471605e-09 or 7.263195155747594e-12 < eps Initial program 29.8
rmApplied sin-sum0.6
Applied associate--l+0.6
if -6.839223651471605e-09 < eps < 7.263195155747594e-12Initial program 43.7
rmApplied diff-sin43.7
Simplified0.2
Final simplification0.4
herbie shell --seed 2019350
(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)))