\sin \left(x + \varepsilon\right) - \sin x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -7.256929432906464 \cdot 10^{-09}:\\
\;\;\;\;\left(\sin x \cdot \cos \varepsilon + \cos x \cdot \sin \varepsilon\right) - \sin x\\
\mathbf{elif}\;\varepsilon \le 1.136872105742304 \cdot 10^{-08}:\\
\;\;\;\;2 \cdot \left(\mathsf{log1p}\left(\mathsf{expm1}\left(\cos \left(\frac{x + \left(x + \varepsilon\right)}{2}\right)\right)\right) \cdot \sin \left(\frac{\varepsilon}{2}\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\left(\sin x \cdot \cos \varepsilon + \cos x \cdot \sin \varepsilon\right) - \sin x\\
\end{array}double f(double x, double eps) {
double r4532359 = x;
double r4532360 = eps;
double r4532361 = r4532359 + r4532360;
double r4532362 = sin(r4532361);
double r4532363 = sin(r4532359);
double r4532364 = r4532362 - r4532363;
return r4532364;
}
double f(double x, double eps) {
double r4532365 = eps;
double r4532366 = -7.256929432906464e-09;
bool r4532367 = r4532365 <= r4532366;
double r4532368 = x;
double r4532369 = sin(r4532368);
double r4532370 = cos(r4532365);
double r4532371 = r4532369 * r4532370;
double r4532372 = cos(r4532368);
double r4532373 = sin(r4532365);
double r4532374 = r4532372 * r4532373;
double r4532375 = r4532371 + r4532374;
double r4532376 = r4532375 - r4532369;
double r4532377 = 1.136872105742304e-08;
bool r4532378 = r4532365 <= r4532377;
double r4532379 = 2.0;
double r4532380 = r4532368 + r4532365;
double r4532381 = r4532368 + r4532380;
double r4532382 = r4532381 / r4532379;
double r4532383 = cos(r4532382);
double r4532384 = expm1(r4532383);
double r4532385 = log1p(r4532384);
double r4532386 = r4532365 / r4532379;
double r4532387 = sin(r4532386);
double r4532388 = r4532385 * r4532387;
double r4532389 = r4532379 * r4532388;
double r4532390 = r4532378 ? r4532389 : r4532376;
double r4532391 = r4532367 ? r4532376 : r4532390;
return r4532391;
}




Bits error versus x




Bits error versus eps
Results
| Original | 37.1 |
|---|---|
| Target | 15.3 |
| Herbie | 0.5 |
if eps < -7.256929432906464e-09 or 1.136872105742304e-08 < eps Initial program 30.0
rmApplied sin-sum0.6
if -7.256929432906464e-09 < eps < 1.136872105742304e-08Initial program 44.8
rmApplied diff-sin44.8
Simplified0.3
rmApplied log1p-expm1-u0.4
Final simplification0.5
herbie shell --seed 2019141 +o rules:numerics
(FPCore (x eps)
:name "2sin (example 3.3)"
:herbie-target
(* 2 (* (cos (+ x (/ eps 2))) (sin (/ eps 2))))
(- (sin (+ x eps)) (sin x)))