\sin \left(x + \varepsilon\right) - \sin x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -8.790289815611559393126472092098999677745 \cdot 10^{-9}:\\
\;\;\;\;\left(\sin x \cdot \cos \varepsilon + \cos x \cdot \sin \varepsilon\right) - \sin x\\
\mathbf{elif}\;\varepsilon \le 8.245159560248622983676760917360476499383 \cdot 10^{-9}:\\
\;\;\;\;\left(\mathsf{expm1}\left(\mathsf{log1p}\left(\cos \left(\frac{\mathsf{fma}\left(2, x, \varepsilon\right)}{2}\right)\right)\right) \cdot \sin \left(\frac{\varepsilon}{2}\right)\right) \cdot 2\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\cos x, \sin \varepsilon, -\sin x\right) + \sin x \cdot \cos \varepsilon\\
\end{array}double f(double x, double eps) {
double r84705 = x;
double r84706 = eps;
double r84707 = r84705 + r84706;
double r84708 = sin(r84707);
double r84709 = sin(r84705);
double r84710 = r84708 - r84709;
return r84710;
}
double f(double x, double eps) {
double r84711 = eps;
double r84712 = -8.79028981561156e-09;
bool r84713 = r84711 <= r84712;
double r84714 = x;
double r84715 = sin(r84714);
double r84716 = cos(r84711);
double r84717 = r84715 * r84716;
double r84718 = cos(r84714);
double r84719 = sin(r84711);
double r84720 = r84718 * r84719;
double r84721 = r84717 + r84720;
double r84722 = r84721 - r84715;
double r84723 = 8.245159560248623e-09;
bool r84724 = r84711 <= r84723;
double r84725 = 2.0;
double r84726 = fma(r84725, r84714, r84711);
double r84727 = r84726 / r84725;
double r84728 = cos(r84727);
double r84729 = log1p(r84728);
double r84730 = expm1(r84729);
double r84731 = r84711 / r84725;
double r84732 = sin(r84731);
double r84733 = r84730 * r84732;
double r84734 = r84733 * r84725;
double r84735 = -r84715;
double r84736 = fma(r84718, r84719, r84735);
double r84737 = r84736 + r84717;
double r84738 = r84724 ? r84734 : r84737;
double r84739 = r84713 ? r84722 : r84738;
return r84739;
}




Bits error versus x




Bits error versus eps
| Original | 36.9 |
|---|---|
| Target | 15.2 |
| Herbie | 0.4 |
if eps < -8.79028981561156e-09Initial program 29.5
rmApplied sin-sum0.5
if -8.79028981561156e-09 < eps < 8.245159560248623e-09Initial program 44.9
rmApplied diff-sin44.9
Simplified0.3
rmApplied expm1-log1p-u0.3
Simplified0.3
if 8.245159560248623e-09 < eps Initial program 29.7
rmApplied sin-sum0.5
Applied associate--l+0.5
Simplified0.5
Final simplification0.4
herbie shell --seed 2019194 +o rules:numerics
(FPCore (x eps)
:name "2sin (example 3.3)"
:herbie-target
(* 2.0 (* (cos (+ x (/ eps 2.0))) (sin (/ eps 2.0))))
(- (sin (+ x eps)) (sin x)))