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 -4.116395237885325980349602596749847942652 \cdot 10^{-308}:\\
\;\;\;\;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(\tan^{-1}_* \frac{x.im}{x.re} \cdot y.re - y.im \cdot \log \left(\frac{-1}{x.re}\right)\right)\\
\mathbf{elif}\;x.re \le 1.699243562056455268990455115712221858063 \cdot 10^{-158} \lor \neg \left(x.re \le 9.889429990153021101785132422468859772448 \cdot 10^{-39}\right):\\
\;\;\;\;e^{\log x.re \cdot y.re - \tan^{-1}_* \frac{x.im}{x.re} \cdot y.im} \cdot \sin \left(\log x.re \cdot y.im + \tan^{-1}_* \frac{x.im}{x.re} \cdot y.re\right)\\
\mathbf{else}:\\
\;\;\;\;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)\\
\end{array}double f(double x_re, double x_im, double y_re, double y_im) {
double r26500 = x_re;
double r26501 = r26500 * r26500;
double r26502 = x_im;
double r26503 = r26502 * r26502;
double r26504 = r26501 + r26503;
double r26505 = sqrt(r26504);
double r26506 = log(r26505);
double r26507 = y_re;
double r26508 = r26506 * r26507;
double r26509 = atan2(r26502, r26500);
double r26510 = y_im;
double r26511 = r26509 * r26510;
double r26512 = r26508 - r26511;
double r26513 = exp(r26512);
double r26514 = r26506 * r26510;
double r26515 = r26509 * r26507;
double r26516 = r26514 + r26515;
double r26517 = sin(r26516);
double r26518 = r26513 * r26517;
return r26518;
}
double f(double x_re, double x_im, double y_re, double y_im) {
double r26519 = x_re;
double r26520 = -4.116395237885326e-308;
bool r26521 = r26519 <= r26520;
double r26522 = r26519 * r26519;
double r26523 = x_im;
double r26524 = r26523 * r26523;
double r26525 = r26522 + r26524;
double r26526 = sqrt(r26525);
double r26527 = log(r26526);
double r26528 = y_re;
double r26529 = r26527 * r26528;
double r26530 = atan2(r26523, r26519);
double r26531 = y_im;
double r26532 = r26530 * r26531;
double r26533 = r26529 - r26532;
double r26534 = exp(r26533);
double r26535 = r26530 * r26528;
double r26536 = -1.0;
double r26537 = r26536 / r26519;
double r26538 = log(r26537);
double r26539 = r26531 * r26538;
double r26540 = r26535 - r26539;
double r26541 = sin(r26540);
double r26542 = r26534 * r26541;
double r26543 = 1.6992435620564553e-158;
bool r26544 = r26519 <= r26543;
double r26545 = 9.889429990153021e-39;
bool r26546 = r26519 <= r26545;
double r26547 = !r26546;
bool r26548 = r26544 || r26547;
double r26549 = log(r26519);
double r26550 = r26549 * r26528;
double r26551 = r26550 - r26532;
double r26552 = exp(r26551);
double r26553 = r26549 * r26531;
double r26554 = r26553 + r26535;
double r26555 = sin(r26554);
double r26556 = r26552 * r26555;
double r26557 = r26527 * r26531;
double r26558 = r26557 + r26535;
double r26559 = sin(r26558);
double r26560 = r26534 * r26559;
double r26561 = r26548 ? r26556 : r26560;
double r26562 = r26521 ? r26542 : r26561;
return r26562;
}



Bits error versus x.re



Bits error versus x.im



Bits error versus y.re



Bits error versus y.im
Results
if x.re < -4.116395237885326e-308Initial program 30.6
rmApplied add-cbrt-cube35.6
Simplified35.6
Taylor expanded around -inf 19.3
if -4.116395237885326e-308 < x.re < 1.6992435620564553e-158 or 9.889429990153021e-39 < x.re Initial program 37.9
Taylor expanded around inf 25.8
Taylor expanded around inf 15.6
if 1.6992435620564553e-158 < x.re < 9.889429990153021e-39Initial program 18.9
Final simplification17.7
herbie shell --seed 2019212
(FPCore (x.re x.im y.re y.im)
:name "powComplex, imaginary part"
:precision binary64
(* (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)))))