\sin \left(x + \varepsilon\right) - \sin x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -0.008151886891035409199446348793571814894676 \lor \neg \left(\varepsilon \le 8.837665134522452590648921417169903147482 \cdot 10^{-9}\right):\\
\;\;\;\;\left(\sin x \cdot \cos \varepsilon + \cos x \cdot \sin \varepsilon\right) - \sin x\\
\mathbf{else}:\\
\;\;\;\;2 \cdot \left(\cos \left(\frac{\mathsf{fma}\left(2, x, \varepsilon\right)}{2}\right) \cdot \sin \left(\frac{\varepsilon}{2}\right)\right)\\
\end{array}double f(double x, double eps) {
double r97543 = x;
double r97544 = eps;
double r97545 = r97543 + r97544;
double r97546 = sin(r97545);
double r97547 = sin(r97543);
double r97548 = r97546 - r97547;
return r97548;
}
double f(double x, double eps) {
double r97549 = eps;
double r97550 = -0.00815188689103541;
bool r97551 = r97549 <= r97550;
double r97552 = 8.837665134522453e-09;
bool r97553 = r97549 <= r97552;
double r97554 = !r97553;
bool r97555 = r97551 || r97554;
double r97556 = x;
double r97557 = sin(r97556);
double r97558 = cos(r97549);
double r97559 = r97557 * r97558;
double r97560 = cos(r97556);
double r97561 = sin(r97549);
double r97562 = r97560 * r97561;
double r97563 = r97559 + r97562;
double r97564 = r97563 - r97557;
double r97565 = 2.0;
double r97566 = fma(r97565, r97556, r97549);
double r97567 = r97566 / r97565;
double r97568 = cos(r97567);
double r97569 = r97549 / r97565;
double r97570 = sin(r97569);
double r97571 = r97568 * r97570;
double r97572 = r97565 * r97571;
double r97573 = r97555 ? r97564 : r97572;
return r97573;
}




Bits error versus x




Bits error versus eps
| Original | 37.1 |
|---|---|
| Target | 15.2 |
| Herbie | 0.4 |
if eps < -0.00815188689103541 or 8.837665134522453e-09 < eps Initial program 30.3
rmApplied sin-sum0.4
if -0.00815188689103541 < eps < 8.837665134522453e-09Initial program 44.1
rmApplied diff-sin44.1
Simplified0.4
rmApplied *-commutative0.4
Final simplification0.4
herbie shell --seed 2019326 +o rules:numerics
(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)))