Average Error: 26.3 → 26.3
Time: 7.9s
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 r42781 = x_re;
        double r42782 = y_re;
        double r42783 = r42781 * r42782;
        double r42784 = x_im;
        double r42785 = y_im;
        double r42786 = r42784 * r42785;
        double r42787 = r42783 + r42786;
        double r42788 = r42782 * r42782;
        double r42789 = r42785 * r42785;
        double r42790 = r42788 + r42789;
        double r42791 = r42787 / r42790;
        return r42791;
}

double f(double x_re, double x_im, double y_re, double y_im) {
        double r42792 = y_re;
        double r42793 = 1.4473657936297032e+65;
        bool r42794 = r42792 <= r42793;
        double r42795 = x_re;
        double r42796 = r42795 * r42792;
        double r42797 = x_im;
        double r42798 = y_im;
        double r42799 = r42797 * r42798;
        double r42800 = r42796 + r42799;
        double r42801 = r42792 * r42792;
        double r42802 = r42798 * r42798;
        double r42803 = r42801 + r42802;
        double r42804 = r42800 / r42803;
        double r42805 = sqrt(r42803);
        double r42806 = r42795 / r42805;
        double r42807 = r42794 ? r42804 : r42806;
        return r42807;
}

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))))