Average Error: 25.2 → 25.1
Time: 15.8s
Precision: 64
\[\frac{x.re \cdot y.re + x.im \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}\]
\[\begin{array}{l} \mathbf{if}\;y.im \le 1.6421156666632428 \cdot 10^{+125}:\\ \;\;\;\;\frac{x.re \cdot y.re + y.im \cdot x.im}{y.im \cdot y.im + y.re \cdot y.re}\\ \mathbf{else}:\\ \;\;\;\;\frac{x.im}{\sqrt{y.im \cdot y.im + y.re \cdot y.re}}\\ \end{array}\]
\frac{x.re \cdot y.re + x.im \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}
\begin{array}{l}
\mathbf{if}\;y.im \le 1.6421156666632428 \cdot 10^{+125}:\\
\;\;\;\;\frac{x.re \cdot y.re + y.im \cdot x.im}{y.im \cdot y.im + y.re \cdot y.re}\\

\mathbf{else}:\\
\;\;\;\;\frac{x.im}{\sqrt{y.im \cdot y.im + y.re \cdot y.re}}\\

\end{array}
double f(double x_re, double x_im, double y_re, double y_im) {
        double r2806143 = x_re;
        double r2806144 = y_re;
        double r2806145 = r2806143 * r2806144;
        double r2806146 = x_im;
        double r2806147 = y_im;
        double r2806148 = r2806146 * r2806147;
        double r2806149 = r2806145 + r2806148;
        double r2806150 = r2806144 * r2806144;
        double r2806151 = r2806147 * r2806147;
        double r2806152 = r2806150 + r2806151;
        double r2806153 = r2806149 / r2806152;
        return r2806153;
}

double f(double x_re, double x_im, double y_re, double y_im) {
        double r2806154 = y_im;
        double r2806155 = 1.6421156666632428e+125;
        bool r2806156 = r2806154 <= r2806155;
        double r2806157 = x_re;
        double r2806158 = y_re;
        double r2806159 = r2806157 * r2806158;
        double r2806160 = x_im;
        double r2806161 = r2806154 * r2806160;
        double r2806162 = r2806159 + r2806161;
        double r2806163 = r2806154 * r2806154;
        double r2806164 = r2806158 * r2806158;
        double r2806165 = r2806163 + r2806164;
        double r2806166 = r2806162 / r2806165;
        double r2806167 = sqrt(r2806165);
        double r2806168 = r2806160 / r2806167;
        double r2806169 = r2806156 ? r2806166 : r2806168;
        return r2806169;
}

Error

Bits error versus x.re

Bits error versus x.im

Bits error versus y.re

Bits error versus y.im

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Derivation

  1. Split input into 2 regimes
  2. if y.im < 1.6421156666632428e+125

    1. Initial program 22.6

      \[\frac{x.re \cdot y.re + x.im \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}\]

    if 1.6421156666632428e+125 < y.im

    1. Initial program 39.4

      \[\frac{x.re \cdot y.re + x.im \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}\]
    2. Using strategy rm
    3. Applied add-sqr-sqrt39.4

      \[\leadsto \frac{x.re \cdot y.re + x.im \cdot y.im}{\color{blue}{\sqrt{y.re \cdot y.re + y.im \cdot y.im} \cdot \sqrt{y.re \cdot y.re + y.im \cdot y.im}}}\]
    4. Applied associate-/r*39.4

      \[\leadsto \color{blue}{\frac{\frac{x.re \cdot y.re + x.im \cdot y.im}{\sqrt{y.re \cdot y.re + y.im \cdot y.im}}}{\sqrt{y.re \cdot y.re + y.im \cdot y.im}}}\]
    5. Taylor expanded around 0 38.7

      \[\leadsto \frac{\color{blue}{x.im}}{\sqrt{y.re \cdot y.re + y.im \cdot y.im}}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification25.1

    \[\leadsto \begin{array}{l} \mathbf{if}\;y.im \le 1.6421156666632428 \cdot 10^{+125}:\\ \;\;\;\;\frac{x.re \cdot y.re + y.im \cdot x.im}{y.im \cdot y.im + y.re \cdot y.re}\\ \mathbf{else}:\\ \;\;\;\;\frac{x.im}{\sqrt{y.im \cdot y.im + y.re \cdot y.re}}\\ \end{array}\]

Reproduce

herbie shell --seed 2019134 
(FPCore (x.re x.im y.re y.im)
  :name "_divideComplex, real part"
  (/ (+ (* x.re y.re) (* x.im y.im)) (+ (* y.re y.re) (* y.im y.im))))