0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -5.4803726878191209 \cdot 10^{-115}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im}{\sqrt{re \cdot re + im \cdot im} - re}}\\
\mathbf{elif}\;re \le -1.2884729287301245 \cdot 10^{-263}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\right)}\\
\mathbf{elif}\;re \le 1.7737595496755384 \cdot 10^{54}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{\sqrt{\sqrt[3]{re \cdot re + im \cdot im} \cdot \sqrt[3]{re \cdot re + im \cdot im}}} \cdot \left(\sqrt{\sqrt{\sqrt[3]{\sqrt{re \cdot re + im \cdot im}} \cdot \sqrt[3]{\sqrt{re \cdot re + im \cdot im}}}} \cdot \sqrt{\sqrt{re \cdot re + im \cdot im}}\right) + re\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(2 \cdot re\right)}\\
\end{array}double f(double re, double im) {
double r256728 = 0.5;
double r256729 = 2.0;
double r256730 = re;
double r256731 = r256730 * r256730;
double r256732 = im;
double r256733 = r256732 * r256732;
double r256734 = r256731 + r256733;
double r256735 = sqrt(r256734);
double r256736 = r256735 + r256730;
double r256737 = r256729 * r256736;
double r256738 = sqrt(r256737);
double r256739 = r256728 * r256738;
return r256739;
}
double f(double re, double im) {
double r256740 = re;
double r256741 = -5.480372687819121e-115;
bool r256742 = r256740 <= r256741;
double r256743 = 0.5;
double r256744 = 2.0;
double r256745 = im;
double r256746 = r256745 * r256745;
double r256747 = r256740 * r256740;
double r256748 = r256747 + r256746;
double r256749 = sqrt(r256748);
double r256750 = r256749 - r256740;
double r256751 = r256746 / r256750;
double r256752 = r256744 * r256751;
double r256753 = sqrt(r256752);
double r256754 = r256743 * r256753;
double r256755 = -1.2884729287301245e-263;
bool r256756 = r256740 <= r256755;
double r256757 = r256740 + r256745;
double r256758 = r256744 * r256757;
double r256759 = sqrt(r256758);
double r256760 = r256743 * r256759;
double r256761 = 1.7737595496755384e+54;
bool r256762 = r256740 <= r256761;
double r256763 = cbrt(r256748);
double r256764 = r256763 * r256763;
double r256765 = sqrt(r256764);
double r256766 = sqrt(r256765);
double r256767 = cbrt(r256749);
double r256768 = r256767 * r256767;
double r256769 = sqrt(r256768);
double r256770 = sqrt(r256769);
double r256771 = sqrt(r256749);
double r256772 = r256770 * r256771;
double r256773 = r256766 * r256772;
double r256774 = r256773 + r256740;
double r256775 = r256744 * r256774;
double r256776 = sqrt(r256775);
double r256777 = r256743 * r256776;
double r256778 = 2.0;
double r256779 = r256778 * r256740;
double r256780 = r256744 * r256779;
double r256781 = sqrt(r256780);
double r256782 = r256743 * r256781;
double r256783 = r256762 ? r256777 : r256782;
double r256784 = r256756 ? r256760 : r256783;
double r256785 = r256742 ? r256754 : r256784;
return r256785;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.7 |
|---|---|
| Target | 33.7 |
| Herbie | 27.8 |
if re < -5.480372687819121e-115Initial program 52.2
rmApplied flip-+52.2
Simplified38.1
if -5.480372687819121e-115 < re < -1.2884729287301245e-263Initial program 32.6
rmApplied add-sqr-sqrt32.6
Applied sqrt-prod32.8
Taylor expanded around 0 37.7
if -1.2884729287301245e-263 < re < 1.7737595496755384e+54Initial program 22.8
rmApplied add-sqr-sqrt22.8
Applied sqrt-prod22.9
rmApplied add-cube-cbrt22.9
Applied sqrt-prod22.9
Applied sqrt-prod22.9
Applied associate-*l*22.9
rmApplied add-sqr-sqrt22.9
Applied cbrt-prod22.9
if 1.7737595496755384e+54 < re Initial program 43.8
Taylor expanded around inf 12.3
Final simplification27.8
herbie shell --seed 2020018
(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)))))