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 -6.9564220004280769 \cdot 10^{-25}:\\
\;\;\;\;e^{\log \left(-x.re\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 -5.5143999901026958 \cdot 10^{-309}:\\
\;\;\;\;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{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(\tan^{-1}_* \frac{x.im}{x.re} \cdot y.re + y.im \cdot \log x.re\right)\\
\end{array}double f(double x_re, double x_im, double y_re, double y_im) {
double r19489 = x_re;
double r19490 = r19489 * r19489;
double r19491 = x_im;
double r19492 = r19491 * r19491;
double r19493 = r19490 + r19492;
double r19494 = sqrt(r19493);
double r19495 = log(r19494);
double r19496 = y_re;
double r19497 = r19495 * r19496;
double r19498 = atan2(r19491, r19489);
double r19499 = y_im;
double r19500 = r19498 * r19499;
double r19501 = r19497 - r19500;
double r19502 = exp(r19501);
double r19503 = r19495 * r19499;
double r19504 = r19498 * r19496;
double r19505 = r19503 + r19504;
double r19506 = sin(r19505);
double r19507 = r19502 * r19506;
return r19507;
}
double f(double x_re, double x_im, double y_re, double y_im) {
double r19508 = x_re;
double r19509 = -6.956422000428077e-25;
bool r19510 = r19508 <= r19509;
double r19511 = -r19508;
double r19512 = log(r19511);
double r19513 = y_re;
double r19514 = r19512 * r19513;
double r19515 = x_im;
double r19516 = atan2(r19515, r19508);
double r19517 = y_im;
double r19518 = r19516 * r19517;
double r19519 = r19514 - r19518;
double r19520 = exp(r19519);
double r19521 = r19516 * r19513;
double r19522 = -1.0;
double r19523 = r19522 / r19508;
double r19524 = log(r19523);
double r19525 = r19517 * r19524;
double r19526 = r19521 - r19525;
double r19527 = sin(r19526);
double r19528 = r19520 * r19527;
double r19529 = -5.514399990102696e-309;
bool r19530 = r19508 <= r19529;
double r19531 = r19508 * r19508;
double r19532 = r19515 * r19515;
double r19533 = r19531 + r19532;
double r19534 = sqrt(r19533);
double r19535 = log(r19534);
double r19536 = r19535 * r19513;
double r19537 = r19536 - r19518;
double r19538 = exp(r19537);
double r19539 = r19538 * r19527;
double r19540 = log(r19508);
double r19541 = r19517 * r19540;
double r19542 = r19521 + r19541;
double r19543 = sin(r19542);
double r19544 = r19538 * r19543;
double r19545 = r19530 ? r19539 : r19544;
double r19546 = r19510 ? r19528 : r19545;
return r19546;
}



Bits error versus x.re



Bits error versus x.im



Bits error versus y.re



Bits error versus y.im
Results
if x.re < -6.956422000428077e-25Initial program 38.3
Taylor expanded around -inf 21.8
Taylor expanded around -inf 4.3
Simplified4.3
if -6.956422000428077e-25 < x.re < -5.514399990102696e-309Initial program 24.3
Taylor expanded around -inf 18.2
if -5.514399990102696e-309 < x.re Initial program 35.5
Taylor expanded around inf 24.3
Simplified24.4
Final simplification17.6
herbie shell --seed 2020046
(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)))))