0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;im \cdot im \le 6.69696849832756618 \cdot 10^{-270}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\mathsf{hypot}\left(re, im\right) + re\right)}\\
\mathbf{elif}\;im \cdot im \le 1.88481914151467382 \cdot 10^{-199}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{0 + {im}^{2}}{\mathsf{hypot}\left(re, im\right) - re}}\\
\mathbf{elif}\;im \cdot im \le 3.330023461604586 \cdot 10^{-91}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\mathsf{hypot}\left(re, im\right) + re\right)}\\
\mathbf{elif}\;im \cdot im \le 1.0159716000531194 \cdot 10^{-52}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{0 + {im}^{2}}{\mathsf{hypot}\left(re, im\right) - re}}\\
\mathbf{elif}\;im \cdot im \le 8.5973745245169301 \cdot 10^{71}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\mathsf{hypot}\left(re, im\right) + re\right)}\\
\mathbf{elif}\;im \cdot im \le 4.4483345476132472 \cdot 10^{154}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{0 + {im}^{2}}{\mathsf{hypot}\left(re, im\right) - re}}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \left(\sqrt{2} \cdot \sqrt{\mathsf{hypot}\left(re, im\right) + re}\right)\\
\end{array}double f(double re, double im) {
double r154142 = 0.5;
double r154143 = 2.0;
double r154144 = re;
double r154145 = r154144 * r154144;
double r154146 = im;
double r154147 = r154146 * r154146;
double r154148 = r154145 + r154147;
double r154149 = sqrt(r154148);
double r154150 = r154149 + r154144;
double r154151 = r154143 * r154150;
double r154152 = sqrt(r154151);
double r154153 = r154142 * r154152;
return r154153;
}
double f(double re, double im) {
double r154154 = im;
double r154155 = r154154 * r154154;
double r154156 = 6.696968498327566e-270;
bool r154157 = r154155 <= r154156;
double r154158 = 0.5;
double r154159 = 2.0;
double r154160 = re;
double r154161 = hypot(r154160, r154154);
double r154162 = r154161 + r154160;
double r154163 = r154159 * r154162;
double r154164 = sqrt(r154163);
double r154165 = r154158 * r154164;
double r154166 = 1.8848191415146738e-199;
bool r154167 = r154155 <= r154166;
double r154168 = 0.0;
double r154169 = 2.0;
double r154170 = pow(r154154, r154169);
double r154171 = r154168 + r154170;
double r154172 = r154161 - r154160;
double r154173 = r154171 / r154172;
double r154174 = r154159 * r154173;
double r154175 = sqrt(r154174);
double r154176 = r154158 * r154175;
double r154177 = 3.330023461604586e-91;
bool r154178 = r154155 <= r154177;
double r154179 = 1.0159716000531194e-52;
bool r154180 = r154155 <= r154179;
double r154181 = 8.59737452451693e+71;
bool r154182 = r154155 <= r154181;
double r154183 = 4.448334547613247e+154;
bool r154184 = r154155 <= r154183;
double r154185 = sqrt(r154159);
double r154186 = sqrt(r154162);
double r154187 = r154185 * r154186;
double r154188 = r154158 * r154187;
double r154189 = r154184 ? r154176 : r154188;
double r154190 = r154182 ? r154165 : r154189;
double r154191 = r154180 ? r154176 : r154190;
double r154192 = r154178 ? r154165 : r154191;
double r154193 = r154167 ? r154176 : r154192;
double r154194 = r154157 ? r154165 : r154193;
return r154194;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.4 |
|---|---|
| Target | 33.4 |
| Herbie | 14.0 |
if (* im im) < 6.696968498327566e-270 or 1.8848191415146738e-199 < (* im im) < 3.330023461604586e-91 or 1.0159716000531194e-52 < (* im im) < 8.59737452451693e+71Initial program 34.7
rmApplied hypot-def17.6
if 6.696968498327566e-270 < (* im im) < 1.8848191415146738e-199 or 3.330023461604586e-91 < (* im im) < 1.0159716000531194e-52 or 8.59737452451693e+71 < (* im im) < 4.448334547613247e+154Initial program 23.4
rmApplied flip-+32.4
Simplified24.4
Simplified20.6
if 4.448334547613247e+154 < (* im im) Initial program 49.1
rmApplied hypot-def6.4
rmApplied sqrt-prod6.8
Final simplification14.0
herbie shell --seed 2020021 +o rules:numerics
(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)))))