\frac{a \cdot c + b \cdot d}{c \cdot c + d \cdot d}\begin{array}{l}
\mathbf{if}\;c \le -4.57826742033894002938478819367906071388 \cdot 10^{162}:\\
\;\;\;\;\frac{-a}{\mathsf{hypot}\left(c, d\right)}\\
\mathbf{elif}\;c \le 1.743552084367145929368643015274633406596 \cdot 10^{178}:\\
\;\;\;\;\frac{\frac{1}{\frac{\mathsf{hypot}\left(c, d\right)}{\mathsf{fma}\left(a, c, b \cdot d\right)}}}{\mathsf{hypot}\left(c, d\right)}\\
\mathbf{else}:\\
\;\;\;\;\frac{a}{\mathsf{hypot}\left(c, d\right)}\\
\end{array}double f(double a, double b, double c, double d) {
double r159559 = a;
double r159560 = c;
double r159561 = r159559 * r159560;
double r159562 = b;
double r159563 = d;
double r159564 = r159562 * r159563;
double r159565 = r159561 + r159564;
double r159566 = r159560 * r159560;
double r159567 = r159563 * r159563;
double r159568 = r159566 + r159567;
double r159569 = r159565 / r159568;
return r159569;
}
double f(double a, double b, double c, double d) {
double r159570 = c;
double r159571 = -4.57826742033894e+162;
bool r159572 = r159570 <= r159571;
double r159573 = a;
double r159574 = -r159573;
double r159575 = d;
double r159576 = hypot(r159570, r159575);
double r159577 = r159574 / r159576;
double r159578 = 1.743552084367146e+178;
bool r159579 = r159570 <= r159578;
double r159580 = 1.0;
double r159581 = b;
double r159582 = r159581 * r159575;
double r159583 = fma(r159573, r159570, r159582);
double r159584 = r159576 / r159583;
double r159585 = r159580 / r159584;
double r159586 = r159585 / r159576;
double r159587 = r159573 / r159576;
double r159588 = r159579 ? r159586 : r159587;
double r159589 = r159572 ? r159577 : r159588;
return r159589;
}




Bits error versus a




Bits error versus b




Bits error versus c




Bits error versus d
| Original | 26.3 |
|---|---|
| Target | 0.5 |
| Herbie | 13.3 |
if c < -4.57826742033894e+162Initial program 45.0
Simplified45.0
rmApplied add-sqr-sqrt45.0
Applied *-un-lft-identity45.0
Applied times-frac45.0
Simplified45.0
Simplified30.0
rmApplied pow130.0
Applied pow130.0
Applied pow-prod-down30.0
Simplified30.0
Taylor expanded around -inf 13.7
Simplified13.7
if -4.57826742033894e+162 < c < 1.743552084367146e+178Initial program 20.8
Simplified20.8
rmApplied add-sqr-sqrt20.8
Applied *-un-lft-identity20.8
Applied times-frac20.8
Simplified20.8
Simplified13.4
rmApplied pow113.4
Applied pow113.4
Applied pow-prod-down13.4
Simplified13.2
rmApplied clear-num13.3
if 1.743552084367146e+178 < c Initial program 43.1
Simplified43.1
rmApplied add-sqr-sqrt43.1
Applied *-un-lft-identity43.1
Applied times-frac43.1
Simplified43.1
Simplified29.0
rmApplied pow129.0
Applied pow129.0
Applied pow-prod-down29.0
Simplified29.0
Taylor expanded around inf 12.4
Final simplification13.3
herbie shell --seed 2019351 +o rules:numerics
(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))))