\sin \left(x + \varepsilon\right) - \sin x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -892737702.61047351360321044921875:\\
\;\;\;\;\left(\sin x \cdot \cos \varepsilon + \cos x \cdot \sin \varepsilon\right) - \sin x\\
\mathbf{elif}\;\varepsilon \le 3.394506424383313479258624062949965816127 \cdot 10^{-9}:\\
\;\;\;\;\left(\mathsf{log1p}\left(\mathsf{expm1}\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 r84320 = x;
double r84321 = eps;
double r84322 = r84320 + r84321;
double r84323 = sin(r84322);
double r84324 = sin(r84320);
double r84325 = r84323 - r84324;
return r84325;
}
double f(double x, double eps) {
double r84326 = eps;
double r84327 = -892737702.6104735;
bool r84328 = r84326 <= r84327;
double r84329 = x;
double r84330 = sin(r84329);
double r84331 = cos(r84326);
double r84332 = r84330 * r84331;
double r84333 = cos(r84329);
double r84334 = sin(r84326);
double r84335 = r84333 * r84334;
double r84336 = r84332 + r84335;
double r84337 = r84336 - r84330;
double r84338 = 3.3945064243833135e-09;
bool r84339 = r84326 <= r84338;
double r84340 = 2.0;
double r84341 = fma(r84340, r84329, r84326);
double r84342 = r84341 / r84340;
double r84343 = cos(r84342);
double r84344 = expm1(r84343);
double r84345 = log1p(r84344);
double r84346 = r84326 / r84340;
double r84347 = sin(r84346);
double r84348 = r84345 * r84347;
double r84349 = r84348 * r84340;
double r84350 = -r84330;
double r84351 = fma(r84333, r84334, r84350);
double r84352 = r84351 + r84332;
double r84353 = r84339 ? r84349 : r84352;
double r84354 = r84328 ? r84337 : r84353;
return r84354;
}




Bits error versus x




Bits error versus eps
| Original | 36.7 |
|---|---|
| Target | 14.9 |
| Herbie | 0.7 |
if eps < -892737702.6104735Initial program 29.6
rmApplied sin-sum0.4
if -892737702.6104735 < eps < 3.3945064243833135e-09Initial program 43.6
rmApplied diff-sin43.6
Simplified0.8
rmApplied log1p-expm1-u0.9
Simplified0.9
rmApplied *-un-lft-identity0.9
if 3.3945064243833135e-09 < eps Initial program 29.9
rmApplied sin-sum0.6
Applied associate--l+0.6
Simplified0.6
Final simplification0.7
herbie shell --seed 2019195 +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)))