\sin \left(x + \varepsilon\right) - \sin x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -0.01398185726995361012614527140840436914004 \lor \neg \left(\varepsilon \le 5.173054498508759236112133194996942845024 \cdot 10^{-30}\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 r105100 = x;
double r105101 = eps;
double r105102 = r105100 + r105101;
double r105103 = sin(r105102);
double r105104 = sin(r105100);
double r105105 = r105103 - r105104;
return r105105;
}
double f(double x, double eps) {
double r105106 = eps;
double r105107 = -0.01398185726995361;
bool r105108 = r105106 <= r105107;
double r105109 = 5.173054498508759e-30;
bool r105110 = r105106 <= r105109;
double r105111 = !r105110;
bool r105112 = r105108 || r105111;
double r105113 = x;
double r105114 = sin(r105113);
double r105115 = cos(r105106);
double r105116 = r105114 * r105115;
double r105117 = cos(r105113);
double r105118 = sin(r105106);
double r105119 = r105117 * r105118;
double r105120 = r105116 + r105119;
double r105121 = r105120 - r105114;
double r105122 = 2.0;
double r105123 = r105106 / r105122;
double r105124 = sin(r105123);
double r105125 = r105113 + r105106;
double r105126 = r105125 + r105113;
double r105127 = r105126 / r105122;
double r105128 = cos(r105127);
double r105129 = r105124 * r105128;
double r105130 = r105122 * r105129;
double r105131 = r105112 ? r105121 : r105130;
return r105131;
}




Bits error versus x




Bits error versus eps
Results
| Original | 37.4 |
|---|---|
| Target | 15.3 |
| Herbie | 0.9 |
if eps < -0.01398185726995361 or 5.173054498508759e-30 < eps Initial program 30.3
rmApplied sin-sum1.4
if -0.01398185726995361 < eps < 5.173054498508759e-30Initial program 45.4
rmApplied diff-sin45.4
Simplified0.4
Final simplification0.9
herbie shell --seed 2019306
(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)))