0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -16209155258582.345703125:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{0 + {im}^{2}}{\mathsf{hypot}\left(re, im\right) - re}}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\mathsf{hypot}\left(re, im\right) + re\right)}\\
\end{array}double f(double re, double im) {
double r174738 = 0.5;
double r174739 = 2.0;
double r174740 = re;
double r174741 = r174740 * r174740;
double r174742 = im;
double r174743 = r174742 * r174742;
double r174744 = r174741 + r174743;
double r174745 = sqrt(r174744);
double r174746 = r174745 + r174740;
double r174747 = r174739 * r174746;
double r174748 = sqrt(r174747);
double r174749 = r174738 * r174748;
return r174749;
}
double f(double re, double im) {
double r174750 = re;
double r174751 = -16209155258582.346;
bool r174752 = r174750 <= r174751;
double r174753 = 0.5;
double r174754 = 2.0;
double r174755 = 0.0;
double r174756 = im;
double r174757 = 2.0;
double r174758 = pow(r174756, r174757);
double r174759 = r174755 + r174758;
double r174760 = hypot(r174750, r174756);
double r174761 = r174760 - r174750;
double r174762 = r174759 / r174761;
double r174763 = r174754 * r174762;
double r174764 = sqrt(r174763);
double r174765 = r174753 * r174764;
double r174766 = r174760 + r174750;
double r174767 = r174754 * r174766;
double r174768 = sqrt(r174767);
double r174769 = r174753 * r174768;
double r174770 = r174752 ? r174765 : r174769;
return r174770;
}




Bits error versus re




Bits error versus im
Results
| Original | 39.4 |
|---|---|
| Target | 34.4 |
| Herbie | 11.7 |
if re < -16209155258582.346Initial program 58.2
rmApplied flip-+58.2
Simplified42.4
Simplified32.5
if -16209155258582.346 < re Initial program 33.3
rmApplied hypot-def5.0
Final simplification11.7
herbie shell --seed 2020002 +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)))))