(FPCore (re im) :precision binary64 (* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))
(FPCore (re im)
:precision binary64
(let* ((t_0
(pow (* (pow (/ -1.0 re) 0.25) (pow (* im (* 0.5 im)) 0.25)) 2.0)))
(if (<= re -3.0096314164618805e+112)
(* 0.5 (* (fma -0.125 (* (/ t_0 (* re re)) (* im im)) t_0) (sqrt 2.0)))
(* 0.5 (sqrt (* 2.0 (+ re (hypot re im))))))))double code(double re, double im) {
return 0.5 * sqrt((2.0 * (sqrt(((re * re) + (im * im))) + re)));
}
double code(double re, double im) {
double t_0 = pow((pow((-1.0 / re), 0.25) * pow((im * (0.5 * im)), 0.25)), 2.0);
double tmp;
if (re <= -3.0096314164618805e+112) {
tmp = 0.5 * (fma(-0.125, ((t_0 / (re * re)) * (im * im)), t_0) * sqrt(2.0));
} else {
tmp = 0.5 * sqrt((2.0 * (re + hypot(re, im))));
}
return tmp;
}
function code(re, im) return Float64(0.5 * sqrt(Float64(2.0 * Float64(sqrt(Float64(Float64(re * re) + Float64(im * im))) + re)))) end
function code(re, im) t_0 = Float64((Float64(-1.0 / re) ^ 0.25) * (Float64(im * Float64(0.5 * im)) ^ 0.25)) ^ 2.0 tmp = 0.0 if (re <= -3.0096314164618805e+112) tmp = Float64(0.5 * Float64(fma(-0.125, Float64(Float64(t_0 / Float64(re * re)) * Float64(im * im)), t_0) * sqrt(2.0))); else tmp = Float64(0.5 * sqrt(Float64(2.0 * Float64(re + hypot(re, im))))); end return tmp end
code[re_, im_] := N[(0.5 * N[Sqrt[N[(2.0 * N[(N[Sqrt[N[(N[(re * re), $MachinePrecision] + N[(im * im), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] + re), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
code[re_, im_] := Block[{t$95$0 = N[Power[N[(N[Power[N[(-1.0 / re), $MachinePrecision], 0.25], $MachinePrecision] * N[Power[N[(im * N[(0.5 * im), $MachinePrecision]), $MachinePrecision], 0.25], $MachinePrecision]), $MachinePrecision], 2.0], $MachinePrecision]}, If[LessEqual[re, -3.0096314164618805e+112], N[(0.5 * N[(N[(-0.125 * N[(N[(t$95$0 / N[(re * re), $MachinePrecision]), $MachinePrecision] * N[(im * im), $MachinePrecision]), $MachinePrecision] + t$95$0), $MachinePrecision] * N[Sqrt[2.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(0.5 * N[Sqrt[N[(2.0 * N[(re + N[Sqrt[re ^ 2 + im ^ 2], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]]
0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
\begin{array}{l}
t_0 := {\left({\left(\frac{-1}{re}\right)}^{0.25} \cdot {\left(im \cdot \left(0.5 \cdot im\right)\right)}^{0.25}\right)}^{2}\\
\mathbf{if}\;re \leq -3.0096314164618805 \cdot 10^{+112}:\\
\;\;\;\;0.5 \cdot \left(\mathsf{fma}\left(-0.125, \frac{t_0}{re \cdot re} \cdot \left(im \cdot im\right), t_0\right) \cdot \sqrt{2}\right)\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}\\
\end{array}
| Original | 39.2 |
|---|---|
| Target | 34.0 |
| Herbie | 10.8 |
if re < -3.00963141646188048e112Initial program 61.9
Simplified41.2
Applied egg-rr41.2
Applied egg-rr41.3
Taylor expanded in re around -inf 27.3
Simplified23.7
if -3.00963141646188048e112 < re Initial program 34.8
Simplified8.3
Final simplification10.8
herbie shell --seed 2022190
(FPCore (re im)
:name "math.sqrt on complex, real part"
:precision binary64
:herbie-target
(if (< re 0.0) (* 0.5 (* (sqrt 2.0) (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)))))