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}\;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) \le 6.647636101584900189095797311473242524604 \cdot 10^{-10}:\\
\;\;\;\;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)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\mathsf{fma}\left(\log \left(\mathsf{hypot}\left(x.re, x.im\right)\right), y.im, \left(\sqrt[3]{\tan^{-1}_* \frac{x.im}{x.re} \cdot y.re} \cdot \sqrt[3]{\tan^{-1}_* \frac{x.im}{x.re} \cdot y.re}\right) \cdot \sqrt[3]{\tan^{-1}_* \frac{x.im}{x.re} \cdot y.re}\right)\right)\right)\right) \cdot \frac{{\left(\mathsf{hypot}\left(x.re, x.im\right)\right)}^{y.re}}{e^{\tan^{-1}_* \frac{x.im}{x.re} \cdot y.im}}\\
\end{array}double f(double x_re, double x_im, double y_re, double y_im) {
double r25417 = x_re;
double r25418 = r25417 * r25417;
double r25419 = x_im;
double r25420 = r25419 * r25419;
double r25421 = r25418 + r25420;
double r25422 = sqrt(r25421);
double r25423 = log(r25422);
double r25424 = y_re;
double r25425 = r25423 * r25424;
double r25426 = atan2(r25419, r25417);
double r25427 = y_im;
double r25428 = r25426 * r25427;
double r25429 = r25425 - r25428;
double r25430 = exp(r25429);
double r25431 = r25423 * r25427;
double r25432 = r25426 * r25424;
double r25433 = r25431 + r25432;
double r25434 = sin(r25433);
double r25435 = r25430 * r25434;
return r25435;
}
double f(double x_re, double x_im, double y_re, double y_im) {
double r25436 = x_re;
double r25437 = r25436 * r25436;
double r25438 = x_im;
double r25439 = r25438 * r25438;
double r25440 = r25437 + r25439;
double r25441 = sqrt(r25440);
double r25442 = log(r25441);
double r25443 = y_re;
double r25444 = r25442 * r25443;
double r25445 = atan2(r25438, r25436);
double r25446 = y_im;
double r25447 = r25445 * r25446;
double r25448 = r25444 - r25447;
double r25449 = exp(r25448);
double r25450 = r25442 * r25446;
double r25451 = r25445 * r25443;
double r25452 = r25450 + r25451;
double r25453 = sin(r25452);
double r25454 = r25449 * r25453;
double r25455 = 6.6476361015849e-10;
bool r25456 = r25454 <= r25455;
double r25457 = hypot(r25436, r25438);
double r25458 = log(r25457);
double r25459 = cbrt(r25451);
double r25460 = r25459 * r25459;
double r25461 = r25460 * r25459;
double r25462 = fma(r25458, r25446, r25461);
double r25463 = sin(r25462);
double r25464 = log1p(r25463);
double r25465 = expm1(r25464);
double r25466 = pow(r25457, r25443);
double r25467 = exp(r25447);
double r25468 = r25466 / r25467;
double r25469 = r25465 * r25468;
double r25470 = r25456 ? r25454 : r25469;
return r25470;
}



Bits error versus x.re



Bits error versus x.im



Bits error versus y.re



Bits error versus y.im
if (* (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)))) < 6.6476361015849e-10Initial program 1.7
if 6.6476361015849e-10 < (* (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)))) Initial program 62.9
Simplified9.8
rmApplied expm1-log1p-u9.8
rmApplied add-cube-cbrt10.0
Final simplification6.0
herbie shell --seed 2019304 +o rules:numerics
(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)))))