0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -3.528167954050153861894555232350182828574 \cdot 10^{-301}:\\
\;\;\;\;0.5 \cdot \left(1 \cdot \sqrt{2 \cdot \frac{im \cdot im}{\sqrt{re \cdot re + im \cdot im} - re}}\right)\\
\mathbf{elif}\;re \le 4.941794989955851304909697931543184438921 \cdot 10^{75}:\\
\;\;\;\;0.5 \cdot \left(1 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\right)\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \left(1 \cdot \sqrt{2 \cdot \left(2 \cdot re\right)}\right)\\
\end{array}double f(double re, double im) {
double r135183 = 0.5;
double r135184 = 2.0;
double r135185 = re;
double r135186 = r135185 * r135185;
double r135187 = im;
double r135188 = r135187 * r135187;
double r135189 = r135186 + r135188;
double r135190 = sqrt(r135189);
double r135191 = r135190 + r135185;
double r135192 = r135184 * r135191;
double r135193 = sqrt(r135192);
double r135194 = r135183 * r135193;
return r135194;
}
double f(double re, double im) {
double r135195 = re;
double r135196 = -3.528167954050154e-301;
bool r135197 = r135195 <= r135196;
double r135198 = 0.5;
double r135199 = 1.0;
double r135200 = 2.0;
double r135201 = im;
double r135202 = r135201 * r135201;
double r135203 = r135195 * r135195;
double r135204 = r135203 + r135202;
double r135205 = sqrt(r135204);
double r135206 = r135205 - r135195;
double r135207 = r135202 / r135206;
double r135208 = r135200 * r135207;
double r135209 = sqrt(r135208);
double r135210 = r135199 * r135209;
double r135211 = r135198 * r135210;
double r135212 = 4.941794989955851e+75;
bool r135213 = r135195 <= r135212;
double r135214 = r135205 + r135195;
double r135215 = r135200 * r135214;
double r135216 = sqrt(r135215);
double r135217 = r135199 * r135216;
double r135218 = r135198 * r135217;
double r135219 = 2.0;
double r135220 = r135219 * r135195;
double r135221 = r135200 * r135220;
double r135222 = sqrt(r135221);
double r135223 = r135199 * r135222;
double r135224 = r135198 * r135223;
double r135225 = r135213 ? r135218 : r135224;
double r135226 = r135197 ? r135211 : r135225;
return r135226;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.9 |
|---|---|
| Target | 33.6 |
| Herbie | 26.7 |
if re < -3.528167954050154e-301Initial program 46.8
rmApplied *-un-lft-identity46.8
rmApplied flip-+46.6
Simplified35.9
if -3.528167954050154e-301 < re < 4.941794989955851e+75Initial program 21.7
rmApplied *-un-lft-identity21.7
if 4.941794989955851e+75 < re Initial program 48.0
rmApplied *-un-lft-identity48.0
rmApplied add-sqr-sqrt48.0
Applied sqrt-prod48.0
Taylor expanded around inf 11.1
Final simplification26.7
herbie shell --seed 2019308
(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)))))