\frac{x.im \cdot y.re - x.re \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}\begin{array}{l}
\mathbf{if}\;y.re \le -2.1140340824639586 \cdot 10^{240}:\\
\;\;\;\;\frac{-1 \cdot x.im}{\mathsf{hypot}\left(y.re, y.im\right)}\\
\mathbf{elif}\;y.re \le 9.40027463443809988 \cdot 10^{-182}:\\
\;\;\;\;\frac{1}{\mathsf{hypot}\left(y.re, y.im\right) \cdot 1} \cdot \frac{x.im \cdot y.re - x.re \cdot y.im}{\mathsf{hypot}\left(y.re, y.im\right)}\\
\mathbf{elif}\;y.re \le 3.2403938167049658 \cdot 10^{148}:\\
\;\;\;\;\frac{x.im}{\frac{\mathsf{fma}\left(y.re, y.re, y.im \cdot y.im\right)}{y.re}} - \frac{x.re}{\frac{\mathsf{fma}\left(y.re, y.re, y.im \cdot y.im\right)}{y.im}}\\
\mathbf{elif}\;y.re \le 1.825216235226745 \cdot 10^{166}:\\
\;\;\;\;\frac{\left(x.im \cdot y.re - x.re \cdot y.im\right) \cdot \frac{1}{\mathsf{hypot}\left(y.re, y.im\right)}}{\mathsf{hypot}\left(y.re, y.im\right)}\\
\mathbf{else}:\\
\;\;\;\;\frac{x.im}{\mathsf{hypot}\left(y.re, y.im\right)}\\
\end{array}double code(double x_46_re, double x_46_im, double y_46_re, double y_46_im) {
return (((x_46_im * y_46_re) - (x_46_re * y_46_im)) / ((y_46_re * y_46_re) + (y_46_im * y_46_im)));
}
double code(double x_46_re, double x_46_im, double y_46_re, double y_46_im) {
double VAR;
if ((y_46_re <= -2.1140340824639586e+240)) {
VAR = ((-1.0 * x_46_im) / hypot(y_46_re, y_46_im));
} else {
double VAR_1;
if ((y_46_re <= 9.4002746344381e-182)) {
VAR_1 = ((1.0 / (hypot(y_46_re, y_46_im) * 1.0)) * (((x_46_im * y_46_re) - (x_46_re * y_46_im)) / hypot(y_46_re, y_46_im)));
} else {
double VAR_2;
if ((y_46_re <= 3.240393816704966e+148)) {
VAR_2 = ((x_46_im / (fma(y_46_re, y_46_re, (y_46_im * y_46_im)) / y_46_re)) - (x_46_re / (fma(y_46_re, y_46_re, (y_46_im * y_46_im)) / y_46_im)));
} else {
double VAR_3;
if ((y_46_re <= 1.8252162352267452e+166)) {
VAR_3 = ((((x_46_im * y_46_re) - (x_46_re * y_46_im)) * (1.0 / hypot(y_46_re, y_46_im))) / hypot(y_46_re, y_46_im));
} else {
VAR_3 = (x_46_im / hypot(y_46_re, y_46_im));
}
VAR_2 = VAR_3;
}
VAR_1 = VAR_2;
}
VAR = VAR_1;
}
return VAR;
}



Bits error versus x.re



Bits error versus x.im



Bits error versus y.re



Bits error versus y.im
Results
if y.re < -2.1140340824639586e+240Initial program 41.9
rmApplied add-sqr-sqrt41.9
Applied *-un-lft-identity41.9
Applied times-frac41.9
Simplified41.9
Simplified34.8
rmApplied associate-*r/34.8
Simplified34.8
Taylor expanded around -inf 9.3
if -2.1140340824639586e+240 < y.re < 9.4002746344381e-182Initial program 24.1
rmApplied add-sqr-sqrt24.1
Applied *-un-lft-identity24.1
Applied times-frac24.1
Simplified24.1
Simplified13.9
if 9.4002746344381e-182 < y.re < 3.240393816704966e+148Initial program 17.5
rmApplied div-sub17.5
Simplified15.2
Simplified13.9
if 3.240393816704966e+148 < y.re < 1.8252162352267452e+166Initial program 47.9
rmApplied add-sqr-sqrt47.9
Applied *-un-lft-identity47.9
Applied times-frac47.9
Simplified47.9
Simplified25.7
rmApplied associate-*r/25.8
Simplified25.7
rmApplied div-inv25.8
if 1.8252162352267452e+166 < y.re Initial program 44.1
rmApplied add-sqr-sqrt44.1
Applied *-un-lft-identity44.1
Applied times-frac44.1
Simplified44.1
Simplified29.5
rmApplied associate-*r/29.5
Simplified29.4
Taylor expanded around inf 13.0
Final simplification13.7
herbie shell --seed 2020103 +o rules:numerics
(FPCore (x.re x.im y.re y.im)
:name "_divideComplex, imaginary part"
:precision binary64
(/ (- (* x.im y.re) (* x.re y.im)) (+ (* y.re y.re) (* y.im y.im))))