\sin \left(x + \varepsilon\right) - \sin x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -8.703827292805686875844406620843923816366 \cdot 10^{-9} \lor \neg \left(\varepsilon \le 3.449975298893777050395065250516960157615 \cdot 10^{-29}\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 r102624 = x;
double r102625 = eps;
double r102626 = r102624 + r102625;
double r102627 = sin(r102626);
double r102628 = sin(r102624);
double r102629 = r102627 - r102628;
return r102629;
}
double f(double x, double eps) {
double r102630 = eps;
double r102631 = -8.703827292805687e-09;
bool r102632 = r102630 <= r102631;
double r102633 = 3.449975298893777e-29;
bool r102634 = r102630 <= r102633;
double r102635 = !r102634;
bool r102636 = r102632 || r102635;
double r102637 = x;
double r102638 = sin(r102637);
double r102639 = cos(r102630);
double r102640 = r102638 * r102639;
double r102641 = cos(r102637);
double r102642 = sin(r102630);
double r102643 = r102641 * r102642;
double r102644 = r102640 + r102643;
double r102645 = r102644 - r102638;
double r102646 = 2.0;
double r102647 = r102630 / r102646;
double r102648 = sin(r102647);
double r102649 = r102637 + r102630;
double r102650 = r102649 + r102637;
double r102651 = r102650 / r102646;
double r102652 = cos(r102651);
double r102653 = r102648 * r102652;
double r102654 = r102646 * r102653;
double r102655 = r102636 ? r102645 : r102654;
return r102655;
}




Bits error versus x




Bits error versus eps
Results
| Original | 36.5 |
|---|---|
| Target | 14.7 |
| Herbie | 0.9 |
if eps < -8.703827292805687e-09 or 3.449975298893777e-29 < eps Initial program 29.1
rmApplied sin-sum1.4
if -8.703827292805687e-09 < eps < 3.449975298893777e-29Initial program 44.9
rmApplied diff-sin44.9
Simplified0.2
Final simplification0.9
herbie shell --seed 2019305
(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)))