e^{\log \left(\sqrt{x.re \cdot x.re + x.im \cdot x.im}\right) \cdot y.re - \tan^{-1}_* \frac{x.im}{x.re} \cdot y.im} \cdot \sin \left(\log \left(\sqrt{x.re \cdot x.re + x.im \cdot x.im}\right) \cdot y.im + \tan^{-1}_* \frac{x.im}{x.re} \cdot y.re\right)\begin{array}{l}
\mathbf{if}\;x.re \le -9.243103292273186243733064370902117084868 \cdot 10^{-70}:\\
\;\;\;\;e^{y.re \cdot \log \left(-x.re\right) - y.im \cdot \tan^{-1}_* \frac{x.im}{x.re}} \cdot \sin \left(y.im \cdot \log \left(-x.re\right) + y.re \cdot \tan^{-1}_* \frac{x.im}{x.re}\right)\\
\mathbf{elif}\;x.re \le 3.033060010744536784370034757295084712292 \cdot 10^{-310}:\\
\;\;\;\;\sin \left(y.im \cdot \log \left(-x.re\right) + y.re \cdot \tan^{-1}_* \frac{x.im}{x.re}\right) \cdot e^{y.re \cdot \log \left(\sqrt{x.im \cdot x.im + x.re \cdot x.re}\right) - y.im \cdot \tan^{-1}_* \frac{x.im}{x.re}}\\
\mathbf{else}:\\
\;\;\;\;e^{y.re \cdot \log \left(\sqrt{x.im \cdot x.im + x.re \cdot x.re}\right) - y.im \cdot \tan^{-1}_* \frac{x.im}{x.re}} \cdot \sin \left(\log x.re \cdot y.im + y.re \cdot \tan^{-1}_* \frac{x.im}{x.re}\right)\\
\end{array}double f(double x_re, double x_im, double y_re, double y_im) {
double r1399953 = x_re;
double r1399954 = r1399953 * r1399953;
double r1399955 = x_im;
double r1399956 = r1399955 * r1399955;
double r1399957 = r1399954 + r1399956;
double r1399958 = sqrt(r1399957);
double r1399959 = log(r1399958);
double r1399960 = y_re;
double r1399961 = r1399959 * r1399960;
double r1399962 = atan2(r1399955, r1399953);
double r1399963 = y_im;
double r1399964 = r1399962 * r1399963;
double r1399965 = r1399961 - r1399964;
double r1399966 = exp(r1399965);
double r1399967 = r1399959 * r1399963;
double r1399968 = r1399962 * r1399960;
double r1399969 = r1399967 + r1399968;
double r1399970 = sin(r1399969);
double r1399971 = r1399966 * r1399970;
return r1399971;
}
double f(double x_re, double x_im, double y_re, double y_im) {
double r1399972 = x_re;
double r1399973 = -9.243103292273186e-70;
bool r1399974 = r1399972 <= r1399973;
double r1399975 = y_re;
double r1399976 = -r1399972;
double r1399977 = log(r1399976);
double r1399978 = r1399975 * r1399977;
double r1399979 = y_im;
double r1399980 = x_im;
double r1399981 = atan2(r1399980, r1399972);
double r1399982 = r1399979 * r1399981;
double r1399983 = r1399978 - r1399982;
double r1399984 = exp(r1399983);
double r1399985 = r1399979 * r1399977;
double r1399986 = r1399975 * r1399981;
double r1399987 = r1399985 + r1399986;
double r1399988 = sin(r1399987);
double r1399989 = r1399984 * r1399988;
double r1399990 = 3.03306001074454e-310;
bool r1399991 = r1399972 <= r1399990;
double r1399992 = r1399980 * r1399980;
double r1399993 = r1399972 * r1399972;
double r1399994 = r1399992 + r1399993;
double r1399995 = sqrt(r1399994);
double r1399996 = log(r1399995);
double r1399997 = r1399975 * r1399996;
double r1399998 = r1399997 - r1399982;
double r1399999 = exp(r1399998);
double r1400000 = r1399988 * r1399999;
double r1400001 = log(r1399972);
double r1400002 = r1400001 * r1399979;
double r1400003 = r1400002 + r1399986;
double r1400004 = sin(r1400003);
double r1400005 = r1399999 * r1400004;
double r1400006 = r1399991 ? r1400000 : r1400005;
double r1400007 = r1399974 ? r1399989 : r1400006;
return r1400007;
}



Bits error versus x.re



Bits error versus x.im



Bits error versus y.re



Bits error versus y.im
Results
if x.re < -9.243103292273186e-70Initial program 36.5
Taylor expanded around -inf 20.7
Simplified20.7
Taylor expanded around -inf 5.8
Simplified5.8
if -9.243103292273186e-70 < x.re < 3.03306001074454e-310Initial program 27.0
Taylor expanded around -inf 20.9
Simplified20.9
if 3.03306001074454e-310 < x.re Initial program 34.9
Taylor expanded around inf 24.3
Simplified24.3
Final simplification18.2
herbie shell --seed 2019200
(FPCore (x.re x.im y.re y.im)
:name "powComplex, imaginary part"
(* (exp (- (* (log (sqrt (+ (* x.re x.re) (* x.im x.im)))) y.re) (* (atan2 x.im x.re) y.im))) (sin (+ (* (log (sqrt (+ (* x.re x.re) (* x.im x.im)))) y.im) (* (atan2 x.im x.re) y.re)))))