0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -9.1917524124082504 \cdot 10^{-219}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(im \cdot \frac{im}{\mathsf{fma}\left(-1, re, \mathsf{hypot}\left(re, im\right)\right)}\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{1} \cdot \mathsf{hypot}\left(re, im\right) + re\right)}\\
\end{array}double f(double re, double im) {
double r218007 = 0.5;
double r218008 = 2.0;
double r218009 = re;
double r218010 = r218009 * r218009;
double r218011 = im;
double r218012 = r218011 * r218011;
double r218013 = r218010 + r218012;
double r218014 = sqrt(r218013);
double r218015 = r218014 + r218009;
double r218016 = r218008 * r218015;
double r218017 = sqrt(r218016);
double r218018 = r218007 * r218017;
return r218018;
}
double f(double re, double im) {
double r218019 = re;
double r218020 = -9.19175241240825e-219;
bool r218021 = r218019 <= r218020;
double r218022 = 0.5;
double r218023 = 2.0;
double r218024 = im;
double r218025 = -1.0;
double r218026 = hypot(r218019, r218024);
double r218027 = fma(r218025, r218019, r218026);
double r218028 = r218024 / r218027;
double r218029 = r218024 * r218028;
double r218030 = r218023 * r218029;
double r218031 = sqrt(r218030);
double r218032 = r218022 * r218031;
double r218033 = 1.0;
double r218034 = sqrt(r218033);
double r218035 = r218034 * r218026;
double r218036 = r218035 + r218019;
double r218037 = r218023 * r218036;
double r218038 = sqrt(r218037);
double r218039 = r218022 * r218038;
double r218040 = r218021 ? r218032 : r218039;
return r218040;
}




Bits error versus re




Bits error versus im
| Original | 38.7 |
|---|---|
| Target | 33.7 |
| Herbie | 5.7 |
if re < -9.19175241240825e-219Initial program 48.2
rmApplied flip-+48.1
Simplified36.8
Simplified31.2
rmApplied *-un-lft-identity31.2
Applied times-frac12.5
Simplified12.5
if -9.19175241240825e-219 < re Initial program 31.3
rmApplied *-un-lft-identity31.3
Applied sqrt-prod31.3
Simplified0.5
Final simplification5.7
herbie shell --seed 2020018 +o rules:numerics
(FPCore (re im)
:name "math.sqrt on complex, real part"
:precision binary64
:herbie-target
(if (< re 0.0) (* 0.5 (* (sqrt 2) (sqrt (/ (* im im) (- (sqrt (+ (* re re) (* im im))) re))))) (* 0.5 (sqrt (* 2 (+ (sqrt (+ (* re re) (* im im))) re)))))
(* 0.5 (sqrt (* 2 (+ (sqrt (+ (* re re) (* im im))) re)))))