0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le 4.003218908727751769435456693065969257664 \cdot 10^{-310}:\\
\;\;\;\;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 8.148041992667695284543397003902154699559 \cdot 10^{135}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left({\left(\sqrt{\sqrt{\sqrt{re \cdot re + im \cdot im}}}\right)}^{3} \cdot \sqrt{\sqrt{\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 r149167 = 0.5;
double r149168 = 2.0;
double r149169 = re;
double r149170 = r149169 * r149169;
double r149171 = im;
double r149172 = r149171 * r149171;
double r149173 = r149170 + r149172;
double r149174 = sqrt(r149173);
double r149175 = r149174 + r149169;
double r149176 = r149168 * r149175;
double r149177 = sqrt(r149176);
double r149178 = r149167 * r149177;
return r149178;
}
double f(double re, double im) {
double r149179 = re;
double r149180 = 4.00321890872775e-310;
bool r149181 = r149179 <= r149180;
double r149182 = 0.5;
double r149183 = im;
double r149184 = r149183 * r149183;
double r149185 = 2.0;
double r149186 = r149184 * r149185;
double r149187 = sqrt(r149186);
double r149188 = r149179 * r149179;
double r149189 = r149188 + r149184;
double r149190 = sqrt(r149189);
double r149191 = r149190 - r149179;
double r149192 = sqrt(r149191);
double r149193 = r149187 / r149192;
double r149194 = r149182 * r149193;
double r149195 = 8.148041992667695e+135;
bool r149196 = r149179 <= r149195;
double r149197 = sqrt(r149190);
double r149198 = sqrt(r149197);
double r149199 = 3.0;
double r149200 = pow(r149198, r149199);
double r149201 = r149200 * r149198;
double r149202 = r149201 + r149179;
double r149203 = r149185 * r149202;
double r149204 = sqrt(r149203);
double r149205 = r149182 * r149204;
double r149206 = r149179 + r149179;
double r149207 = r149185 * r149206;
double r149208 = sqrt(r149207);
double r149209 = r149182 * r149208;
double r149210 = r149196 ? r149205 : r149209;
double r149211 = r149181 ? r149194 : r149210;
return r149211;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.9 |
|---|---|
| Target | 33.7 |
| Herbie | 26.5 |
if re < 4.00321890872775e-310Initial program 46.3
rmApplied flip-+46.2
Applied associate-*r/46.2
Applied sqrt-div46.2
Simplified35.1
if 4.00321890872775e-310 < re < 8.148041992667695e+135Initial program 21.0
rmApplied add-sqr-sqrt21.0
Applied sqrt-prod21.1
rmApplied add-sqr-sqrt21.1
Applied sqrt-prod21.1
Applied sqrt-prod21.2
Applied associate-*r*21.2
Simplified21.3
if 8.148041992667695e+135 < re Initial program 58.0
Taylor expanded around inf 8.4
Final simplification26.5
herbie shell --seed 2019303
(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)))))