\sin \left(x + \varepsilon\right) - \sin x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -8.78183908127777317 \cdot 10^{-9} \lor \neg \left(\varepsilon \le 1.19054048034770088 \cdot 10^{-8}\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 r145649 = x;
double r145650 = eps;
double r145651 = r145649 + r145650;
double r145652 = sin(r145651);
double r145653 = sin(r145649);
double r145654 = r145652 - r145653;
return r145654;
}
double f(double x, double eps) {
double r145655 = eps;
double r145656 = -8.781839081277773e-09;
bool r145657 = r145655 <= r145656;
double r145658 = 1.1905404803477009e-08;
bool r145659 = r145655 <= r145658;
double r145660 = !r145659;
bool r145661 = r145657 || r145660;
double r145662 = x;
double r145663 = sin(r145662);
double r145664 = cos(r145655);
double r145665 = r145663 * r145664;
double r145666 = cos(r145662);
double r145667 = sin(r145655);
double r145668 = r145666 * r145667;
double r145669 = r145665 + r145668;
double r145670 = r145669 - r145663;
double r145671 = 2.0;
double r145672 = r145655 / r145671;
double r145673 = sin(r145672);
double r145674 = r145662 + r145655;
double r145675 = r145674 + r145662;
double r145676 = r145675 / r145671;
double r145677 = cos(r145676);
double r145678 = r145673 * r145677;
double r145679 = r145671 * r145678;
double r145680 = r145661 ? r145670 : r145679;
return r145680;
}




Bits error versus x




Bits error versus eps
Results
| Original | 37.1 |
|---|---|
| Target | 15.2 |
| Herbie | 0.4 |
if eps < -8.781839081277773e-09 or 1.1905404803477009e-08 < eps Initial program 30.1
rmApplied sin-sum0.5
if -8.781839081277773e-09 < eps < 1.1905404803477009e-08Initial program 44.4
rmApplied diff-sin44.4
Simplified0.3
Final simplification0.4
herbie shell --seed 2020046
(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)))