double f(double re, double im) {
double r26870409 = 0.5;
double r26870410 = re;
double r26870411 = sin(r26870410);
double r26870412 = r26870409 * r26870411;
double r26870413 = im;
double r26870414 = -r26870413;
double r26870415 = exp(r26870414);
double r26870416 = exp(r26870413);
double r26870417 = r26870415 - r26870416;
double r26870418 = r26870412 * r26870417;
return r26870418;
}
double f(double re, double im) {
double r26870419 = im;
double r26870420 = -0.3333333333333333;
double r26870421 = r26870419 * r26870420;
double r26870422 = -2.0;
double r26870423 = fma(r26870421, r26870419, r26870422);
double r26870424 = 5.0;
double r26870425 = pow(r26870419, r26870424);
double r26870426 = -0.016666666666666666;
double r26870427 = r26870425 * r26870426;
double r26870428 = fma(r26870423, r26870419, r26870427);
double r26870429 = re;
double r26870430 = sin(r26870429);
double r26870431 = 0.5;
double r26870432 = r26870430 * r26870431;
double r26870433 = r26870428 * r26870432;
return r26870433;
}
\left(0.5 \cdot \sin re\right) \cdot \left(e^{-im} - e^{im}\right)(\left((\left(im \cdot \frac{-1}{3}\right) \cdot im + -2)_*\right) \cdot im + \left({im}^{5} \cdot \frac{-1}{60}\right))_* \cdot \left(\sin re \cdot 0.5\right)



Bits error versus re




Bits error versus im
| Original | 43.5 |
|---|---|
| Target | 0.3 |
| Herbie | 0.8 |
Initial program 43.5
Taylor expanded around 0 0.8
Simplified0.8
rmApplied pow10.8
Applied pow10.8
Applied pow10.8
Applied pow-prod-down0.8
Applied pow-prod-down0.8
Simplified0.8
Final simplification0.8
herbie shell --seed 2019101 +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))))