\sin \left(x + \varepsilon\right) - \sin x
2 \cdot \left(\sin \left(\varepsilon \cdot \frac{1}{2}\right) \cdot \mathsf{log1p}\left(\mathsf{expm1}\left(\cos x \cdot \cos \left(\varepsilon \cdot \frac{1}{2}\right) - \log \left(e^{\sin \left(\varepsilon \cdot \frac{1}{2}\right) \cdot \sin x}\right)\right)\right)\right)double f(double x, double eps) {
double r6088199 = x;
double r6088200 = eps;
double r6088201 = r6088199 + r6088200;
double r6088202 = sin(r6088201);
double r6088203 = sin(r6088199);
double r6088204 = r6088202 - r6088203;
return r6088204;
}
double f(double x, double eps) {
double r6088205 = 2.0;
double r6088206 = eps;
double r6088207 = 0.5;
double r6088208 = r6088206 * r6088207;
double r6088209 = sin(r6088208);
double r6088210 = x;
double r6088211 = cos(r6088210);
double r6088212 = cos(r6088208);
double r6088213 = r6088211 * r6088212;
double r6088214 = sin(r6088210);
double r6088215 = r6088209 * r6088214;
double r6088216 = exp(r6088215);
double r6088217 = log(r6088216);
double r6088218 = r6088213 - r6088217;
double r6088219 = expm1(r6088218);
double r6088220 = log1p(r6088219);
double r6088221 = r6088209 * r6088220;
double r6088222 = r6088205 * r6088221;
return r6088222;
}




Bits error versus x




Bits error versus eps
Results
| Original | 36.3 |
|---|---|
| Target | 15.2 |
| Herbie | 0.5 |
Initial program 36.3
rmApplied diff-sin36.7
Simplified15.2
rmApplied log1p-expm1-u15.3
Simplified15.3
rmApplied fma-udef15.3
Applied cos-sum0.4
rmApplied add-log-exp0.5
Final simplification0.5
herbie shell --seed 2019165 +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)))