\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(\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 r88484 = x;
double r88485 = eps;
double r88486 = r88484 + r88485;
double r88487 = sin(r88486);
double r88488 = sin(r88484);
double r88489 = r88487 - r88488;
return r88489;
}
double f(double x, double eps) {
double r88490 = eps;
double r88491 = -1.1565737311297234e-08;
bool r88492 = r88490 <= r88491;
double r88493 = 1.3130033279220329e-17;
bool r88494 = r88490 <= r88493;
double r88495 = !r88494;
bool r88496 = r88492 || r88495;
double r88497 = x;
double r88498 = sin(r88497);
double r88499 = cos(r88490);
double r88500 = r88498 * r88499;
double r88501 = cos(r88497);
double r88502 = sin(r88490);
double r88503 = r88501 * r88502;
double r88504 = r88500 + r88503;
double r88505 = r88504 - r88498;
double r88506 = 2.0;
double r88507 = fma(r88506, r88497, r88490);
double r88508 = r88507 / r88506;
double r88509 = cos(r88508);
double r88510 = r88490 / r88506;
double r88511 = sin(r88510);
double r88512 = r88509 * r88511;
double r88513 = r88506 * r88512;
double r88514 = r88496 ? r88505 : r88513;
return r88514;
}




Bits error versus x




Bits error versus eps
| 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
rmApplied *-commutative0.2
Final simplification0.5
herbie shell --seed 2019304 +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)))