0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -8.5002325289073938542506059003071417869 \cdot 10^{-258}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{{im}^{2}}{\sqrt{re \cdot re + im \cdot im} - re}}\\
\mathbf{elif}\;re \le 3.614811860462173462455471699918830373615 \cdot 10^{-246}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(im + re\right)}\\
\mathbf{elif}\;re \le 8.439330033545885045213726212950052594665 \cdot 10^{67}:\\
\;\;\;\;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 r150306 = 0.5;
double r150307 = 2.0;
double r150308 = re;
double r150309 = r150308 * r150308;
double r150310 = im;
double r150311 = r150310 * r150310;
double r150312 = r150309 + r150311;
double r150313 = sqrt(r150312);
double r150314 = r150313 + r150308;
double r150315 = r150307 * r150314;
double r150316 = sqrt(r150315);
double r150317 = r150306 * r150316;
return r150317;
}
double f(double re, double im) {
double r150318 = re;
double r150319 = -8.500232528907394e-258;
bool r150320 = r150318 <= r150319;
double r150321 = 0.5;
double r150322 = 2.0;
double r150323 = im;
double r150324 = 2.0;
double r150325 = pow(r150323, r150324);
double r150326 = r150318 * r150318;
double r150327 = r150323 * r150323;
double r150328 = r150326 + r150327;
double r150329 = sqrt(r150328);
double r150330 = r150329 - r150318;
double r150331 = r150325 / r150330;
double r150332 = r150322 * r150331;
double r150333 = sqrt(r150332);
double r150334 = r150321 * r150333;
double r150335 = 3.6148118604621735e-246;
bool r150336 = r150318 <= r150335;
double r150337 = r150323 + r150318;
double r150338 = r150322 * r150337;
double r150339 = sqrt(r150338);
double r150340 = r150321 * r150339;
double r150341 = 8.439330033545885e+67;
bool r150342 = r150318 <= r150341;
double r150343 = r150329 + r150318;
double r150344 = r150322 * r150343;
double r150345 = sqrt(r150344);
double r150346 = r150321 * r150345;
double r150347 = r150318 + r150318;
double r150348 = r150322 * r150347;
double r150349 = sqrt(r150348);
double r150350 = r150321 * r150349;
double r150351 = r150342 ? r150346 : r150350;
double r150352 = r150336 ? r150340 : r150351;
double r150353 = r150320 ? r150334 : r150352;
return r150353;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.3 |
|---|---|
| Target | 33.4 |
| Herbie | 26.7 |
if re < -8.500232528907394e-258Initial program 46.6
rmApplied flip-+46.5
Simplified35.9
if -8.500232528907394e-258 < re < 3.6148118604621735e-246Initial program 30.4
rmApplied add-exp-log32.5
rmApplied pow1/232.5
Applied log-pow32.5
Applied exp-prod32.8
Taylor expanded around 0 32.3
if 3.6148118604621735e-246 < re < 8.439330033545885e+67Initial program 19.4
if 8.439330033545885e+67 < re Initial program 46.7
rmApplied add-cube-cbrt46.8
Taylor expanded around inf 12.0
Final simplification26.7
herbie shell --seed 2020001
(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)))))