0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -1.1661686244914884 \cdot 10^{135}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im}{\frac{1 \cdot \left(-2 \cdot re\right)}{im}}}\\
\mathbf{elif}\;re \le 2.9879541772399109 \cdot 10^{-274}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{\frac{im}{\sqrt{re \cdot re + im \cdot im} - re}}{\frac{1}{im}}}\\
\mathbf{elif}\;re \le 3.11509516621680597 \cdot 10^{98}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{\sqrt{re \cdot re + im \cdot im}} \cdot \sqrt{\sqrt{re \cdot re + im \cdot im}} + re\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(2 \cdot re\right)}\\
\end{array}double f(double re, double im) {
double r138937 = 0.5;
double r138938 = 2.0;
double r138939 = re;
double r138940 = r138939 * r138939;
double r138941 = im;
double r138942 = r138941 * r138941;
double r138943 = r138940 + r138942;
double r138944 = sqrt(r138943);
double r138945 = r138944 + r138939;
double r138946 = r138938 * r138945;
double r138947 = sqrt(r138946);
double r138948 = r138937 * r138947;
return r138948;
}
double f(double re, double im) {
double r138949 = re;
double r138950 = -1.1661686244914884e+135;
bool r138951 = r138949 <= r138950;
double r138952 = 0.5;
double r138953 = 2.0;
double r138954 = im;
double r138955 = 1.0;
double r138956 = -2.0;
double r138957 = r138956 * r138949;
double r138958 = r138955 * r138957;
double r138959 = r138958 / r138954;
double r138960 = r138954 / r138959;
double r138961 = r138953 * r138960;
double r138962 = sqrt(r138961);
double r138963 = r138952 * r138962;
double r138964 = 2.987954177239911e-274;
bool r138965 = r138949 <= r138964;
double r138966 = r138949 * r138949;
double r138967 = r138954 * r138954;
double r138968 = r138966 + r138967;
double r138969 = sqrt(r138968);
double r138970 = r138969 - r138949;
double r138971 = r138954 / r138970;
double r138972 = r138955 / r138954;
double r138973 = r138971 / r138972;
double r138974 = r138953 * r138973;
double r138975 = sqrt(r138974);
double r138976 = r138952 * r138975;
double r138977 = 3.115095166216806e+98;
bool r138978 = r138949 <= r138977;
double r138979 = sqrt(r138969);
double r138980 = r138979 * r138979;
double r138981 = r138980 + r138949;
double r138982 = r138953 * r138981;
double r138983 = sqrt(r138982);
double r138984 = r138952 * r138983;
double r138985 = 2.0;
double r138986 = r138985 * r138949;
double r138987 = r138953 * r138986;
double r138988 = sqrt(r138987);
double r138989 = r138952 * r138988;
double r138990 = r138978 ? r138984 : r138989;
double r138991 = r138965 ? r138976 : r138990;
double r138992 = r138951 ? r138963 : r138991;
return r138992;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.6 |
|---|---|
| Target | 33.7 |
| Herbie | 22.7 |
if re < -1.1661686244914884e+135Initial program 62.7
rmApplied flip-+62.7
Simplified48.6
rmApplied unpow248.6
Applied associate-/l*48.2
rmApplied *-un-lft-identity48.2
Taylor expanded around -inf 23.9
if -1.1661686244914884e+135 < re < 2.987954177239911e-274Initial program 39.0
rmApplied flip-+38.9
Simplified31.4
rmApplied unpow231.4
Applied associate-/l*29.4
rmApplied *-un-lft-identity29.4
rmApplied div-inv29.4
Applied associate-/r*29.4
Simplified29.4
if 2.987954177239911e-274 < re < 3.115095166216806e+98Initial program 20.2
rmApplied add-sqr-sqrt20.2
Applied sqrt-prod20.3
if 3.115095166216806e+98 < re Initial program 50.6
Taylor expanded around inf 10.6
Final simplification22.7
herbie shell --seed 2020003
(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)))))