\sin \left(x + \varepsilon\right) - \sin x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -1.156573731129723388055868311301635498189 \cdot 10^{-8} \lor \neg \left(\varepsilon \le 1.313003327922032909289180230548081681769 \cdot 10^{-17}\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 r97863 = x;
double r97864 = eps;
double r97865 = r97863 + r97864;
double r97866 = sin(r97865);
double r97867 = sin(r97863);
double r97868 = r97866 - r97867;
return r97868;
}
double f(double x, double eps) {
double r97869 = eps;
double r97870 = -1.1565737311297234e-08;
bool r97871 = r97869 <= r97870;
double r97872 = 1.3130033279220329e-17;
bool r97873 = r97869 <= r97872;
double r97874 = !r97873;
bool r97875 = r97871 || r97874;
double r97876 = x;
double r97877 = sin(r97876);
double r97878 = cos(r97869);
double r97879 = r97877 * r97878;
double r97880 = cos(r97876);
double r97881 = sin(r97869);
double r97882 = r97880 * r97881;
double r97883 = r97879 + r97882;
double r97884 = r97883 - r97877;
double r97885 = 2.0;
double r97886 = r97869 / r97885;
double r97887 = sin(r97886);
double r97888 = r97876 + r97869;
double r97889 = r97888 + r97876;
double r97890 = r97889 / r97885;
double r97891 = cos(r97890);
double r97892 = r97887 * r97891;
double r97893 = r97885 * r97892;
double r97894 = r97875 ? r97884 : r97893;
return r97894;
}




Bits error versus x




Bits error versus eps
Results
| Original | 37.0 |
|---|---|
| Target | 15.0 |
| Herbie | 0.5 |
if eps < -1.1565737311297234e-08 or 1.3130033279220329e-17 < eps Initial program 29.8
rmApplied sin-sum0.8
if -1.1565737311297234e-08 < eps < 1.3130033279220329e-17Initial program 44.9
rmApplied diff-sin44.9
Simplified0.2
Final simplification0.5
herbie shell --seed 2019304
(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)))