Average Error: 26.3 → 26.3
Time: 4.0s
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.re \le 1.44736579362970321 \cdot 10^{65}:\\ \;\;\;\;\frac{x.re \cdot y.re + x.im \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}\\ \mathbf{else}:\\ \;\;\;\;\frac{x.re}{\sqrt{y.re \cdot y.re + y.im \cdot y.im}}\\ \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.re \le 1.44736579362970321 \cdot 10^{65}:\\
\;\;\;\;\frac{x.re \cdot y.re + x.im \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}\\

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

\end{array}
double f(double x_re, double x_im, double y_re, double y_im) {
        double r71427 = x_re;
        double r71428 = y_re;
        double r71429 = r71427 * r71428;
        double r71430 = x_im;
        double r71431 = y_im;
        double r71432 = r71430 * r71431;
        double r71433 = r71429 + r71432;
        double r71434 = r71428 * r71428;
        double r71435 = r71431 * r71431;
        double r71436 = r71434 + r71435;
        double r71437 = r71433 / r71436;
        return r71437;
}

double f(double x_re, double x_im, double y_re, double y_im) {
        double r71438 = y_re;
        double r71439 = 1.4473657936297032e+65;
        bool r71440 = r71438 <= r71439;
        double r71441 = x_re;
        double r71442 = r71441 * r71438;
        double r71443 = x_im;
        double r71444 = y_im;
        double r71445 = r71443 * r71444;
        double r71446 = r71442 + r71445;
        double r71447 = r71438 * r71438;
        double r71448 = r71444 * r71444;
        double r71449 = r71447 + r71448;
        double r71450 = r71446 / r71449;
        double r71451 = sqrt(r71449);
        double r71452 = r71441 / r71451;
        double r71453 = r71440 ? r71450 : r71452;
        return r71453;
}

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.re < 1.4473657936297032e+65

    1. Initial program 23.4

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

    if 1.4473657936297032e+65 < y.re

    1. Initial program 37.2

      \[\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-sqrt37.2

      \[\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*37.2

      \[\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 inf 37.2

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

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

Reproduce

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