0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;im \le -1.441632117965090729034477936091225621824 \cdot 10^{130}:\\
\;\;\;\;\sqrt{\left(re - im\right) \cdot 2} \cdot 0.5\\
\mathbf{elif}\;im \le -2.189611672069496067339837167306464880369 \cdot 10^{-76}:\\
\;\;\;\;0.5 \cdot \sqrt{\frac{2}{\frac{\sqrt{im \cdot im + re \cdot re} - re}{im \cdot im}}}\\
\mathbf{elif}\;im \le -4.190115021433093475778322144492022440801 \cdot 10^{-106}:\\
\;\;\;\;0.5 \cdot \sqrt{\left(re + re\right) \cdot 2}\\
\mathbf{elif}\;im \le -1.678034623638905128007132667026297084812 \cdot 10^{-192}:\\
\;\;\;\;0.5 \cdot \frac{\sqrt{2}}{\sqrt{\sqrt{im \cdot im + re \cdot re} - re} \cdot \frac{1}{\left|im\right|}}\\
\mathbf{elif}\;im \le -2.202839589489608152764748747416607358454 \cdot 10^{-271}:\\
\;\;\;\;0.5 \cdot \sqrt{\left(re + re\right) \cdot 2}\\
\mathbf{elif}\;im \le -2.307054431974968782446493295888505497751 \cdot 10^{-297}:\\
\;\;\;\;\left(\sqrt{2} \cdot \frac{\left|im\right|}{\sqrt{\sqrt{im \cdot im + re \cdot re} - re}}\right) \cdot 0.5\\
\mathbf{elif}\;im \le 5.619322708680105428423648477878223187784 \cdot 10^{-154}:\\
\;\;\;\;0.5 \cdot \sqrt{\left(re + re\right) \cdot 2}\\
\mathbf{elif}\;im \le 4.082479651686054026413039830347871667354 \cdot 10^{61}:\\
\;\;\;\;\left(\sqrt{2} \cdot \frac{\left|im\right|}{\sqrt{\sqrt{im \cdot im + re \cdot re} - re}}\right) \cdot 0.5\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{\left(im + re\right) \cdot 2}\\
\end{array}double f(double re, double im) {
double r100809 = 0.5;
double r100810 = 2.0;
double r100811 = re;
double r100812 = r100811 * r100811;
double r100813 = im;
double r100814 = r100813 * r100813;
double r100815 = r100812 + r100814;
double r100816 = sqrt(r100815);
double r100817 = r100816 + r100811;
double r100818 = r100810 * r100817;
double r100819 = sqrt(r100818);
double r100820 = r100809 * r100819;
return r100820;
}
double f(double re, double im) {
double r100821 = im;
double r100822 = -1.4416321179650907e+130;
bool r100823 = r100821 <= r100822;
double r100824 = re;
double r100825 = r100824 - r100821;
double r100826 = 2.0;
double r100827 = r100825 * r100826;
double r100828 = sqrt(r100827);
double r100829 = 0.5;
double r100830 = r100828 * r100829;
double r100831 = -2.189611672069496e-76;
bool r100832 = r100821 <= r100831;
double r100833 = r100821 * r100821;
double r100834 = r100824 * r100824;
double r100835 = r100833 + r100834;
double r100836 = sqrt(r100835);
double r100837 = r100836 - r100824;
double r100838 = r100837 / r100833;
double r100839 = r100826 / r100838;
double r100840 = sqrt(r100839);
double r100841 = r100829 * r100840;
double r100842 = -4.1901150214330935e-106;
bool r100843 = r100821 <= r100842;
double r100844 = r100824 + r100824;
double r100845 = r100844 * r100826;
double r100846 = sqrt(r100845);
double r100847 = r100829 * r100846;
double r100848 = -1.6780346236389051e-192;
bool r100849 = r100821 <= r100848;
double r100850 = sqrt(r100826);
double r100851 = sqrt(r100837);
double r100852 = 1.0;
double r100853 = fabs(r100821);
double r100854 = r100852 / r100853;
double r100855 = r100851 * r100854;
double r100856 = r100850 / r100855;
double r100857 = r100829 * r100856;
double r100858 = -2.2028395894896082e-271;
bool r100859 = r100821 <= r100858;
double r100860 = -2.3070544319749688e-297;
bool r100861 = r100821 <= r100860;
double r100862 = r100853 / r100851;
double r100863 = r100850 * r100862;
double r100864 = r100863 * r100829;
double r100865 = 5.6193227086801054e-154;
bool r100866 = r100821 <= r100865;
double r100867 = 4.082479651686054e+61;
bool r100868 = r100821 <= r100867;
double r100869 = r100821 + r100824;
double r100870 = r100869 * r100826;
double r100871 = sqrt(r100870);
double r100872 = r100829 * r100871;
double r100873 = r100868 ? r100864 : r100872;
double r100874 = r100866 ? r100847 : r100873;
double r100875 = r100861 ? r100864 : r100874;
double r100876 = r100859 ? r100847 : r100875;
double r100877 = r100849 ? r100857 : r100876;
double r100878 = r100843 ? r100847 : r100877;
double r100879 = r100832 ? r100841 : r100878;
double r100880 = r100823 ? r100830 : r100879;
return r100880;
}




Bits error versus re




Bits error versus im
Results
| Original | 39.0 |
|---|---|
| Target | 33.5 |
| Herbie | 22.9 |
if im < -1.4416321179650907e+130Initial program 57.7
Simplified57.7
rmApplied add-cube-cbrt57.8
Simplified57.8
Simplified57.8
Taylor expanded around -inf 8.2
if -1.4416321179650907e+130 < im < -2.189611672069496e-76Initial program 22.8
Simplified22.8
rmApplied flip-+29.2
Applied associate-*l/29.2
Applied sqrt-div29.3
Simplified22.1
Simplified22.1
rmApplied sqrt-undiv21.9
Simplified21.9
if -2.189611672069496e-76 < im < -4.1901150214330935e-106 or -1.6780346236389051e-192 < im < -2.2028395894896082e-271 or -2.3070544319749688e-297 < im < 5.6193227086801054e-154Initial program 41.8
Simplified41.8
Taylor expanded around inf 36.6
if -4.1901150214330935e-106 < im < -1.6780346236389051e-192Initial program 36.2
Simplified36.2
rmApplied flip-+50.8
Applied associate-*l/50.8
Applied sqrt-div51.0
Simplified42.1
Simplified42.1
rmApplied sqrt-prod42.2
Applied associate-/l*42.2
Simplified34.3
rmApplied div-inv34.3
if -2.2028395894896082e-271 < im < -2.3070544319749688e-297 or 5.6193227086801054e-154 < im < 4.082479651686054e+61Initial program 27.9
Simplified27.9
rmApplied flip-+38.0
Applied associate-*l/38.0
Applied sqrt-div38.1
Simplified26.9
Simplified26.9
rmApplied sqrt-prod26.9
Applied associate-/l*26.9
Simplified25.9
rmApplied div-inv25.9
Simplified25.8
if 4.082479651686054e+61 < im Initial program 46.8
Simplified46.8
rmApplied add-cube-cbrt47.0
Simplified47.0
Simplified47.0
Taylor expanded around inf 11.7
Simplified11.7
Final simplification22.9
herbie shell --seed 2019196
(FPCore (re im)
:name "math.sqrt on complex, real part"
:herbie-target
(if (< re 0.0) (* 0.5 (* (sqrt 2.0) (sqrt (/ (* im im) (- (sqrt (+ (* re re) (* im im))) re))))) (* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))
(* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))