\left(0.5 \cdot \sin re\right) \cdot \left(e^{-im} - e^{im}\right)0.5 \cdot \left(\sin re \cdot \left(\frac{-1}{3} \cdot {im}^{3}\right)\right) + \left(0.5 \cdot \sin re\right) \cdot \left(-\mathsf{fma}\left(\frac{1}{60}, {im}^{5}, 2 \cdot im\right)\right)double f(double re, double im) {
double r254800 = 0.5;
double r254801 = re;
double r254802 = sin(r254801);
double r254803 = r254800 * r254802;
double r254804 = im;
double r254805 = -r254804;
double r254806 = exp(r254805);
double r254807 = exp(r254804);
double r254808 = r254806 - r254807;
double r254809 = r254803 * r254808;
return r254809;
}
double f(double re, double im) {
double r254810 = 0.5;
double r254811 = re;
double r254812 = sin(r254811);
double r254813 = -0.3333333333333333;
double r254814 = im;
double r254815 = 3.0;
double r254816 = pow(r254814, r254815);
double r254817 = r254813 * r254816;
double r254818 = r254812 * r254817;
double r254819 = r254810 * r254818;
double r254820 = r254810 * r254812;
double r254821 = 0.016666666666666666;
double r254822 = 5.0;
double r254823 = pow(r254814, r254822);
double r254824 = 2.0;
double r254825 = r254824 * r254814;
double r254826 = fma(r254821, r254823, r254825);
double r254827 = -r254826;
double r254828 = r254820 * r254827;
double r254829 = r254819 + r254828;
return r254829;
}




Bits error versus re




Bits error versus im
| Original | 44.2 |
|---|---|
| Target | 0.3 |
| Herbie | 0.8 |
Initial program 44.2
Taylor expanded around 0 0.8
Simplified0.8
rmApplied sub-neg0.8
Applied distribute-lft-in0.8
Simplified0.8
Final simplification0.8
herbie shell --seed 2020027 +o rules:numerics
(FPCore (re im)
:name "math.cos on complex, imaginary part"
:precision binary64
:herbie-target
(if (< (fabs im) 1) (- (* (sin re) (+ (+ im (* (* (* 0.16666666666666666 im) im) im)) (* (* (* (* (* 0.008333333333333333 im) im) im) im) im)))) (* (* 0.5 (sin re)) (- (exp (- im)) (exp im))))
(* (* 0.5 (sin re)) (- (exp (- im)) (exp im))))