\left(0.5 \cdot \sin re\right) \cdot \left(e^{-im} - e^{im}\right)\left(\frac{-1}{3} \cdot \left(im \cdot \left(im \cdot im\right)\right) - \mathsf{fma}\left(\frac{1}{60}, {im}^{5}, im + im\right)\right) \cdot \left(0.5 \cdot \sin re\right)double f(double re, double im) {
double r3978047 = 0.5;
double r3978048 = re;
double r3978049 = sin(r3978048);
double r3978050 = r3978047 * r3978049;
double r3978051 = im;
double r3978052 = -r3978051;
double r3978053 = exp(r3978052);
double r3978054 = exp(r3978051);
double r3978055 = r3978053 - r3978054;
double r3978056 = r3978050 * r3978055;
return r3978056;
}
double f(double re, double im) {
double r3978057 = -0.3333333333333333;
double r3978058 = im;
double r3978059 = r3978058 * r3978058;
double r3978060 = r3978058 * r3978059;
double r3978061 = r3978057 * r3978060;
double r3978062 = 0.016666666666666666;
double r3978063 = 5.0;
double r3978064 = pow(r3978058, r3978063);
double r3978065 = r3978058 + r3978058;
double r3978066 = fma(r3978062, r3978064, r3978065);
double r3978067 = r3978061 - r3978066;
double r3978068 = 0.5;
double r3978069 = re;
double r3978070 = sin(r3978069);
double r3978071 = r3978068 * r3978070;
double r3978072 = r3978067 * r3978071;
return r3978072;
}




Bits error versus re




Bits error versus im
| Original | 43.3 |
|---|---|
| Target | 0.3 |
| Herbie | 0.9 |
Initial program 43.3
Taylor expanded around 0 0.9
Simplified0.9
Final simplification0.9
herbie shell --seed 2019154 +o rules:numerics
(FPCore (re im)
:name "math.cos on complex, imaginary part"
:herbie-target
(if (< (fabs im) 1) (- (* (sin re) (+ (+ im (* (* (* 1/6 im) im) im)) (* (* (* (* (* 1/120 im) im) im) im) im)))) (* (* 0.5 (sin re)) (- (exp (- im)) (exp im))))
(* (* 0.5 (sin re)) (- (exp (- im)) (exp im))))