Average Error: 26.5 → 26.3
Time: 3.5s
Precision: 64
\[\frac{a \cdot c + b \cdot d}{c \cdot c + d \cdot d}\]
\[\begin{array}{l} \mathbf{if}\;\frac{a \cdot c + b \cdot d}{c \cdot c + d \cdot d} \le 5.1588593744494812 \cdot 10^{245}:\\ \;\;\;\;\frac{a \cdot c + b \cdot d}{c \cdot c + d \cdot d}\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{\sqrt{c \cdot c + d \cdot d}} \cdot \left(-1 \cdot a\right)\\ \end{array}\]
\frac{a \cdot c + b \cdot d}{c \cdot c + d \cdot d}
\begin{array}{l}
\mathbf{if}\;\frac{a \cdot c + b \cdot d}{c \cdot c + d \cdot d} \le 5.1588593744494812 \cdot 10^{245}:\\
\;\;\;\;\frac{a \cdot c + b \cdot d}{c \cdot c + d \cdot d}\\

\mathbf{else}:\\
\;\;\;\;\frac{1}{\sqrt{c \cdot c + d \cdot d}} \cdot \left(-1 \cdot a\right)\\

\end{array}
double f(double a, double b, double c, double d) {
        double r105135 = a;
        double r105136 = c;
        double r105137 = r105135 * r105136;
        double r105138 = b;
        double r105139 = d;
        double r105140 = r105138 * r105139;
        double r105141 = r105137 + r105140;
        double r105142 = r105136 * r105136;
        double r105143 = r105139 * r105139;
        double r105144 = r105142 + r105143;
        double r105145 = r105141 / r105144;
        return r105145;
}

double f(double a, double b, double c, double d) {
        double r105146 = a;
        double r105147 = c;
        double r105148 = r105146 * r105147;
        double r105149 = b;
        double r105150 = d;
        double r105151 = r105149 * r105150;
        double r105152 = r105148 + r105151;
        double r105153 = r105147 * r105147;
        double r105154 = r105150 * r105150;
        double r105155 = r105153 + r105154;
        double r105156 = r105152 / r105155;
        double r105157 = 5.158859374449481e+245;
        bool r105158 = r105156 <= r105157;
        double r105159 = 1.0;
        double r105160 = sqrt(r105155);
        double r105161 = r105159 / r105160;
        double r105162 = -1.0;
        double r105163 = r105162 * r105146;
        double r105164 = r105161 * r105163;
        double r105165 = r105158 ? r105156 : r105164;
        return r105165;
}

Error

Bits error versus a

Bits error versus b

Bits error versus c

Bits error versus d

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original26.5
Target0.5
Herbie26.3
\[\begin{array}{l} \mathbf{if}\;\left|d\right| \lt \left|c\right|:\\ \;\;\;\;\frac{a + b \cdot \frac{d}{c}}{c + d \cdot \frac{d}{c}}\\ \mathbf{else}:\\ \;\;\;\;\frac{b + a \cdot \frac{c}{d}}{d + c \cdot \frac{c}{d}}\\ \end{array}\]

Derivation

  1. Split input into 2 regimes
  2. if (/ (+ (* a c) (* b d)) (+ (* c c) (* d d))) < 5.158859374449481e+245

    1. Initial program 14.6

      \[\frac{a \cdot c + b \cdot d}{c \cdot c + d \cdot d}\]

    if 5.158859374449481e+245 < (/ (+ (* a c) (* b d)) (+ (* c c) (* d d)))

    1. Initial program 60.6

      \[\frac{a \cdot c + b \cdot d}{c \cdot c + d \cdot d}\]
    2. Using strategy rm
    3. Applied add-sqr-sqrt60.6

      \[\leadsto \frac{a \cdot c + b \cdot d}{\color{blue}{\sqrt{c \cdot c + d \cdot d} \cdot \sqrt{c \cdot c + d \cdot d}}}\]
    4. Applied *-un-lft-identity60.6

      \[\leadsto \frac{\color{blue}{1 \cdot \left(a \cdot c + b \cdot d\right)}}{\sqrt{c \cdot c + d \cdot d} \cdot \sqrt{c \cdot c + d \cdot d}}\]
    5. Applied times-frac60.6

      \[\leadsto \color{blue}{\frac{1}{\sqrt{c \cdot c + d \cdot d}} \cdot \frac{a \cdot c + b \cdot d}{\sqrt{c \cdot c + d \cdot d}}}\]
    6. Taylor expanded around -inf 60.1

      \[\leadsto \frac{1}{\sqrt{c \cdot c + d \cdot d}} \cdot \color{blue}{\left(-1 \cdot a\right)}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification26.3

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{a \cdot c + b \cdot d}{c \cdot c + d \cdot d} \le 5.1588593744494812 \cdot 10^{245}:\\ \;\;\;\;\frac{a \cdot c + b \cdot d}{c \cdot c + d \cdot d}\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{\sqrt{c \cdot c + d \cdot d}} \cdot \left(-1 \cdot a\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2020057 
(FPCore (a b c d)
  :name "Complex division, real part"
  :precision binary64

  :herbie-target
  (if (< (fabs d) (fabs c)) (/ (+ a (* b (/ d c))) (+ c (* d (/ d c)))) (/ (+ b (* a (/ c d))) (+ d (* c (/ c d)))))

  (/ (+ (* a c) (* b d)) (+ (* c c) (* d d))))