\sin \left(x + \varepsilon\right) - \sin x
\mathsf{fma}\left(\sin x, \cos \varepsilon - 1, \mathsf{expm1}\left(\mathsf{log1p}\left(\cos x \cdot \sin \varepsilon\right)\right)\right)double f(double x, double eps) {
double r127305 = x;
double r127306 = eps;
double r127307 = r127305 + r127306;
double r127308 = sin(r127307);
double r127309 = sin(r127305);
double r127310 = r127308 - r127309;
return r127310;
}
double f(double x, double eps) {
double r127311 = x;
double r127312 = sin(r127311);
double r127313 = eps;
double r127314 = cos(r127313);
double r127315 = 1.0;
double r127316 = r127314 - r127315;
double r127317 = cos(r127311);
double r127318 = sin(r127313);
double r127319 = r127317 * r127318;
double r127320 = log1p(r127319);
double r127321 = expm1(r127320);
double r127322 = fma(r127312, r127316, r127321);
return r127322;
}




Bits error versus x




Bits error versus eps
| Original | 37.1 |
|---|---|
| Target | 15.5 |
| Herbie | 0.4 |
Initial program 37.1
rmApplied sin-sum21.5
Applied associate--l+21.5
Taylor expanded around inf 21.5
Simplified0.4
rmApplied expm1-log1p-u0.4
Final simplification0.4
herbie shell --seed 2019344 +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)))