0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -2.6219396713989246 \cdot 10^{+28}:\\
\;\;\;\;\frac{\sqrt{\left(im \cdot im\right) \cdot 2.0}}{\sqrt{\sqrt{im \cdot im + re \cdot re} - re}} \cdot 0.5\\
\mathbf{elif}\;re \le -3.0560575984185278 \cdot 10^{-28}:\\
\;\;\;\;\sqrt{2.0 \cdot \left(im + re\right)} \cdot 0.5\\
\mathbf{elif}\;re \le -2.4751289839842727 \cdot 10^{-197}:\\
\;\;\;\;0.5 \cdot \sqrt{2.0 \cdot \frac{im \cdot im}{\sqrt{im \cdot im + re \cdot re} - re}}\\
\mathbf{elif}\;re \le -1.0467551994962917 \cdot 10^{-267}:\\
\;\;\;\;\sqrt{2.0 \cdot \left(im + re\right)} \cdot 0.5\\
\mathbf{elif}\;re \le 9.007455771870733 \cdot 10^{+76}:\\
\;\;\;\;0.5 \cdot \left(\sqrt{\sqrt{\left(re + \sqrt{im \cdot im + re \cdot re}\right) \cdot 2.0}} \cdot \sqrt{\sqrt{\left(re + \sqrt{im \cdot im + re \cdot re}\right) \cdot 2.0}}\right)\\
\mathbf{else}:\\
\;\;\;\;\sqrt{\left(re + re\right) \cdot 2.0} \cdot 0.5\\
\end{array}double f(double re, double im) {
double r8754962 = 0.5;
double r8754963 = 2.0;
double r8754964 = re;
double r8754965 = r8754964 * r8754964;
double r8754966 = im;
double r8754967 = r8754966 * r8754966;
double r8754968 = r8754965 + r8754967;
double r8754969 = sqrt(r8754968);
double r8754970 = r8754969 + r8754964;
double r8754971 = r8754963 * r8754970;
double r8754972 = sqrt(r8754971);
double r8754973 = r8754962 * r8754972;
return r8754973;
}
double f(double re, double im) {
double r8754974 = re;
double r8754975 = -2.6219396713989246e+28;
bool r8754976 = r8754974 <= r8754975;
double r8754977 = im;
double r8754978 = r8754977 * r8754977;
double r8754979 = 2.0;
double r8754980 = r8754978 * r8754979;
double r8754981 = sqrt(r8754980);
double r8754982 = r8754974 * r8754974;
double r8754983 = r8754978 + r8754982;
double r8754984 = sqrt(r8754983);
double r8754985 = r8754984 - r8754974;
double r8754986 = sqrt(r8754985);
double r8754987 = r8754981 / r8754986;
double r8754988 = 0.5;
double r8754989 = r8754987 * r8754988;
double r8754990 = -3.0560575984185278e-28;
bool r8754991 = r8754974 <= r8754990;
double r8754992 = r8754977 + r8754974;
double r8754993 = r8754979 * r8754992;
double r8754994 = sqrt(r8754993);
double r8754995 = r8754994 * r8754988;
double r8754996 = -2.4751289839842727e-197;
bool r8754997 = r8754974 <= r8754996;
double r8754998 = r8754978 / r8754985;
double r8754999 = r8754979 * r8754998;
double r8755000 = sqrt(r8754999);
double r8755001 = r8754988 * r8755000;
double r8755002 = -1.0467551994962917e-267;
bool r8755003 = r8754974 <= r8755002;
double r8755004 = 9.007455771870733e+76;
bool r8755005 = r8754974 <= r8755004;
double r8755006 = r8754974 + r8754984;
double r8755007 = r8755006 * r8754979;
double r8755008 = sqrt(r8755007);
double r8755009 = sqrt(r8755008);
double r8755010 = r8755009 * r8755009;
double r8755011 = r8754988 * r8755010;
double r8755012 = r8754974 + r8754974;
double r8755013 = r8755012 * r8754979;
double r8755014 = sqrt(r8755013);
double r8755015 = r8755014 * r8754988;
double r8755016 = r8755005 ? r8755011 : r8755015;
double r8755017 = r8755003 ? r8754995 : r8755016;
double r8755018 = r8754997 ? r8755001 : r8755017;
double r8755019 = r8754991 ? r8754995 : r8755018;
double r8755020 = r8754976 ? r8754989 : r8755019;
return r8755020;
}




Bits error versus re




Bits error versus im
Results
| Original | 37.5 |
|---|---|
| Target | 32.7 |
| Herbie | 26.9 |
if re < -2.6219396713989246e+28Initial program 56.5
rmApplied flip-+56.5
Applied associate-*r/56.5
Applied sqrt-div56.5
Simplified39.6
if -2.6219396713989246e+28 < re < -3.0560575984185278e-28 or -2.4751289839842727e-197 < re < -1.0467551994962917e-267Initial program 38.3
Taylor expanded around 0 40.8
if -3.0560575984185278e-28 < re < -2.4751289839842727e-197Initial program 33.3
rmApplied flip-+33.2
Simplified28.7
if -1.0467551994962917e-267 < re < 9.007455771870733e+76Initial program 21.4
rmApplied add-sqr-sqrt21.7
if 9.007455771870733e+76 < re Initial program 45.8
Taylor expanded around inf 12.0
Final simplification26.9
herbie shell --seed 2019162
(FPCore (re im)
:name "math.sqrt on complex, real part"
:herbie-target
(if (< re 0) (* 0.5 (* (sqrt 2) (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)))))