0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -3.814628739965902096406813270111746645619 \cdot 10^{-263}:\\
\;\;\;\;0.5 \cdot \frac{\sqrt{\left(im \cdot im\right) \cdot 2}}{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}}\\
\mathbf{elif}\;re \le 2.3167926112470144021051643520230044425 \cdot 10^{-257}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\right)}\\
\mathbf{elif}\;re \le 8.343480543279894342881010577799208380709 \cdot 10^{103}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + re\right)}\\
\end{array}double f(double re, double im) {
double r112922 = 0.5;
double r112923 = 2.0;
double r112924 = re;
double r112925 = r112924 * r112924;
double r112926 = im;
double r112927 = r112926 * r112926;
double r112928 = r112925 + r112927;
double r112929 = sqrt(r112928);
double r112930 = r112929 + r112924;
double r112931 = r112923 * r112930;
double r112932 = sqrt(r112931);
double r112933 = r112922 * r112932;
return r112933;
}
double f(double re, double im) {
double r112934 = re;
double r112935 = -3.814628739965902e-263;
bool r112936 = r112934 <= r112935;
double r112937 = 0.5;
double r112938 = im;
double r112939 = r112938 * r112938;
double r112940 = 2.0;
double r112941 = r112939 * r112940;
double r112942 = sqrt(r112941);
double r112943 = r112934 * r112934;
double r112944 = r112943 + r112939;
double r112945 = sqrt(r112944);
double r112946 = r112945 - r112934;
double r112947 = sqrt(r112946);
double r112948 = r112942 / r112947;
double r112949 = r112937 * r112948;
double r112950 = 2.3167926112470144e-257;
bool r112951 = r112934 <= r112950;
double r112952 = r112934 + r112938;
double r112953 = r112940 * r112952;
double r112954 = sqrt(r112953);
double r112955 = r112937 * r112954;
double r112956 = 8.343480543279894e+103;
bool r112957 = r112934 <= r112956;
double r112958 = r112945 + r112934;
double r112959 = r112940 * r112958;
double r112960 = sqrt(r112959);
double r112961 = r112937 * r112960;
double r112962 = r112934 + r112934;
double r112963 = r112940 * r112962;
double r112964 = sqrt(r112963);
double r112965 = r112937 * r112964;
double r112966 = r112957 ? r112961 : r112965;
double r112967 = r112951 ? r112955 : r112966;
double r112968 = r112936 ? r112949 : r112967;
return r112968;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.3 |
|---|---|
| Target | 33.4 |
| Herbie | 26.3 |
if re < -3.814628739965902e-263Initial program 47.0
rmApplied flip-+46.9
Applied associate-*r/46.9
Applied sqrt-div47.0
Simplified35.4
if -3.814628739965902e-263 < re < 2.3167926112470144e-257Initial program 30.3
rmApplied add-sqr-sqrt30.3
Applied sqrt-prod30.4
rmApplied add-sqr-sqrt30.4
Applied sqrt-prod30.4
Applied sqrt-prod30.5
Applied associate-*r*30.5
Simplified30.5
Taylor expanded around 0 32.6
if 2.3167926112470144e-257 < re < 8.343480543279894e+103Initial program 19.6
if 8.343480543279894e+103 < re Initial program 51.4
Taylor expanded around inf 9.9
Final simplification26.3
herbie shell --seed 2019306
(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)))))