
(FPCore (re im) :precision binary64 (* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))
double code(double re, double im) {
return 0.5 * sqrt((2.0 * (sqrt(((re * re) + (im * im))) + re)));
}
real(8) function code(re, im)
real(8), intent (in) :: re
real(8), intent (in) :: im
code = 0.5d0 * sqrt((2.0d0 * (sqrt(((re * re) + (im * im))) + re)))
end function
public static double code(double re, double im) {
return 0.5 * Math.sqrt((2.0 * (Math.sqrt(((re * re) + (im * im))) + re)));
}
def code(re, im): return 0.5 * math.sqrt((2.0 * (math.sqrt(((re * re) + (im * im))) + re)))
function code(re, im) return Float64(0.5 * sqrt(Float64(2.0 * Float64(sqrt(Float64(Float64(re * re) + Float64(im * im))) + re)))) end
function tmp = code(re, im) tmp = 0.5 * sqrt((2.0 * (sqrt(((re * re) + (im * im))) + re))); 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]
\begin{array}{l}
\\
0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 9 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (re im) :precision binary64 (* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))
double code(double re, double im) {
return 0.5 * sqrt((2.0 * (sqrt(((re * re) + (im * im))) + re)));
}
real(8) function code(re, im)
real(8), intent (in) :: re
real(8), intent (in) :: im
code = 0.5d0 * sqrt((2.0d0 * (sqrt(((re * re) + (im * im))) + re)))
end function
public static double code(double re, double im) {
return 0.5 * Math.sqrt((2.0 * (Math.sqrt(((re * re) + (im * im))) + re)));
}
def code(re, im): return 0.5 * math.sqrt((2.0 * (math.sqrt(((re * re) + (im * im))) + re)))
function code(re, im) return Float64(0.5 * sqrt(Float64(2.0 * Float64(sqrt(Float64(Float64(re * re) + Float64(im * im))) + re)))) end
function tmp = code(re, im) tmp = 0.5 * sqrt((2.0 * (sqrt(((re * re) + (im * im))) + re))); 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]
\begin{array}{l}
\\
0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
\end{array}
(FPCore (re im)
:precision binary64
(let* ((t_0 (pow (* (pow (* im im) 0.25) (pow (/ -1.0 re) 0.25)) 2.0)))
(if (<= re -1.26e+128)
(* 0.5 (fma -0.125 (* (/ (* im im) re) (/ t_0 re)) t_0))
(sqrt (* 0.5 (+ re (hypot re im)))))))
double code(double re, double im) {
double t_0 = pow((pow((im * im), 0.25) * pow((-1.0 / re), 0.25)), 2.0);
double tmp;
if (re <= -1.26e+128) {
tmp = 0.5 * fma(-0.125, (((im * im) / re) * (t_0 / re)), t_0);
} else {
tmp = sqrt((0.5 * (re + hypot(re, im))));
}
return tmp;
}
function code(re, im) t_0 = Float64((Float64(im * im) ^ 0.25) * (Float64(-1.0 / re) ^ 0.25)) ^ 2.0 tmp = 0.0 if (re <= -1.26e+128) tmp = Float64(0.5 * fma(-0.125, Float64(Float64(Float64(im * im) / re) * Float64(t_0 / re)), t_0)); else tmp = sqrt(Float64(0.5 * Float64(re + hypot(re, im)))); end return tmp end
code[re_, im_] := Block[{t$95$0 = N[Power[N[(N[Power[N[(im * im), $MachinePrecision], 0.25], $MachinePrecision] * N[Power[N[(-1.0 / re), $MachinePrecision], 0.25], $MachinePrecision]), $MachinePrecision], 2.0], $MachinePrecision]}, If[LessEqual[re, -1.26e+128], N[(0.5 * N[(-0.125 * N[(N[(N[(im * im), $MachinePrecision] / re), $MachinePrecision] * N[(t$95$0 / re), $MachinePrecision]), $MachinePrecision] + t$95$0), $MachinePrecision]), $MachinePrecision], N[Sqrt[N[(0.5 * N[(re + N[Sqrt[re ^ 2 + im ^ 2], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := {\left({\left(im \cdot im\right)}^{0.25} \cdot {\left(\frac{-1}{re}\right)}^{0.25}\right)}^{2}\\
\mathbf{if}\;re \leq -1.26 \cdot 10^{+128}:\\
\;\;\;\;0.5 \cdot \mathsf{fma}\left(-0.125, \frac{im \cdot im}{re} \cdot \frac{t_0}{re}, t_0\right)\\
\mathbf{else}:\\
\;\;\;\;\sqrt{0.5 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}\\
\end{array}
\end{array}
if re < -1.26000000000000009e128Initial program 3.8%
+-commutative3.8%
hypot-def28.5%
Simplified28.5%
add-sqr-sqrt28.6%
pow228.6%
pow1/228.6%
sqrt-pow128.6%
*-commutative28.6%
metadata-eval28.6%
Applied egg-rr28.6%
Taylor expanded in re around -inf 76.3%
fma-def76.3%
Simplified86.2%
if -1.26000000000000009e128 < re Initial program 50.0%
+-commutative50.0%
hypot-def90.9%
Simplified90.9%
add-sqr-sqrt90.2%
sqrt-unprod90.9%
*-commutative90.9%
*-commutative90.9%
swap-sqr90.9%
add-sqr-sqrt90.9%
*-commutative90.9%
metadata-eval90.9%
Applied egg-rr90.9%
associate-*l*90.9%
metadata-eval90.9%
Simplified90.9%
Final simplification90.2%
(FPCore (re im) :precision binary64 (if (<= re -1.95e+101) (* 0.5 (pow (* (pow (* im im) 0.25) (pow (/ -1.0 re) 0.25)) 2.0)) (sqrt (* 0.5 (+ re (hypot re im))))))
double code(double re, double im) {
double tmp;
if (re <= -1.95e+101) {
tmp = 0.5 * pow((pow((im * im), 0.25) * pow((-1.0 / re), 0.25)), 2.0);
} else {
tmp = sqrt((0.5 * (re + hypot(re, im))));
}
return tmp;
}
public static double code(double re, double im) {
double tmp;
if (re <= -1.95e+101) {
tmp = 0.5 * Math.pow((Math.pow((im * im), 0.25) * Math.pow((-1.0 / re), 0.25)), 2.0);
} else {
tmp = Math.sqrt((0.5 * (re + Math.hypot(re, im))));
}
return tmp;
}
def code(re, im): tmp = 0 if re <= -1.95e+101: tmp = 0.5 * math.pow((math.pow((im * im), 0.25) * math.pow((-1.0 / re), 0.25)), 2.0) else: tmp = math.sqrt((0.5 * (re + math.hypot(re, im)))) return tmp
function code(re, im) tmp = 0.0 if (re <= -1.95e+101) tmp = Float64(0.5 * (Float64((Float64(im * im) ^ 0.25) * (Float64(-1.0 / re) ^ 0.25)) ^ 2.0)); else tmp = sqrt(Float64(0.5 * Float64(re + hypot(re, im)))); end return tmp end
function tmp_2 = code(re, im) tmp = 0.0; if (re <= -1.95e+101) tmp = 0.5 * ((((im * im) ^ 0.25) * ((-1.0 / re) ^ 0.25)) ^ 2.0); else tmp = sqrt((0.5 * (re + hypot(re, im)))); end tmp_2 = tmp; end
code[re_, im_] := If[LessEqual[re, -1.95e+101], N[(0.5 * N[Power[N[(N[Power[N[(im * im), $MachinePrecision], 0.25], $MachinePrecision] * N[Power[N[(-1.0 / re), $MachinePrecision], 0.25], $MachinePrecision]), $MachinePrecision], 2.0], $MachinePrecision]), $MachinePrecision], N[Sqrt[N[(0.5 * N[(re + N[Sqrt[re ^ 2 + im ^ 2], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;re \leq -1.95 \cdot 10^{+101}:\\
\;\;\;\;0.5 \cdot {\left({\left(im \cdot im\right)}^{0.25} \cdot {\left(\frac{-1}{re}\right)}^{0.25}\right)}^{2}\\
\mathbf{else}:\\
\;\;\;\;\sqrt{0.5 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}\\
\end{array}
\end{array}
if re < -1.95e101Initial program 8.5%
+-commutative8.5%
hypot-def31.4%
Simplified31.4%
add-sqr-sqrt31.5%
pow231.5%
pow1/231.5%
sqrt-pow131.5%
*-commutative31.5%
metadata-eval31.5%
Applied egg-rr31.5%
Taylor expanded in re around -inf 80.1%
distribute-rgt-in80.1%
exp-sum80.3%
exp-to-pow80.7%
unpow280.7%
exp-to-pow84.7%
Simplified84.7%
if -1.95e101 < re Initial program 49.7%
+-commutative49.7%
hypot-def91.2%
Simplified91.2%
add-sqr-sqrt90.5%
sqrt-unprod91.2%
*-commutative91.2%
*-commutative91.2%
swap-sqr91.2%
add-sqr-sqrt91.2%
*-commutative91.2%
metadata-eval91.2%
Applied egg-rr91.2%
associate-*l*91.2%
metadata-eval91.2%
Simplified91.2%
Final simplification90.2%
(FPCore (re im) :precision binary64 (if (<= re -5e+99) (* 0.5 (sqrt (* (- im) (/ im re)))) (sqrt (* 0.5 (+ re (hypot re im))))))
double code(double re, double im) {
double tmp;
if (re <= -5e+99) {
tmp = 0.5 * sqrt((-im * (im / re)));
} else {
tmp = sqrt((0.5 * (re + hypot(re, im))));
}
return tmp;
}
public static double code(double re, double im) {
double tmp;
if (re <= -5e+99) {
tmp = 0.5 * Math.sqrt((-im * (im / re)));
} else {
tmp = Math.sqrt((0.5 * (re + Math.hypot(re, im))));
}
return tmp;
}
def code(re, im): tmp = 0 if re <= -5e+99: tmp = 0.5 * math.sqrt((-im * (im / re))) else: tmp = math.sqrt((0.5 * (re + math.hypot(re, im)))) return tmp
function code(re, im) tmp = 0.0 if (re <= -5e+99) tmp = Float64(0.5 * sqrt(Float64(Float64(-im) * Float64(im / re)))); else tmp = sqrt(Float64(0.5 * Float64(re + hypot(re, im)))); end return tmp end
function tmp_2 = code(re, im) tmp = 0.0; if (re <= -5e+99) tmp = 0.5 * sqrt((-im * (im / re))); else tmp = sqrt((0.5 * (re + hypot(re, im)))); end tmp_2 = tmp; end
code[re_, im_] := If[LessEqual[re, -5e+99], N[(0.5 * N[Sqrt[N[((-im) * N[(im / re), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[Sqrt[N[(0.5 * N[(re + N[Sqrt[re ^ 2 + im ^ 2], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;re \leq -5 \cdot 10^{+99}:\\
\;\;\;\;0.5 \cdot \sqrt{\left(-im\right) \cdot \frac{im}{re}}\\
\mathbf{else}:\\
\;\;\;\;\sqrt{0.5 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}\\
\end{array}
\end{array}
if re < -5.00000000000000008e99Initial program 8.5%
+-commutative8.5%
hypot-def31.4%
Simplified31.4%
Taylor expanded in re around -inf 71.7%
associate-*r/71.7%
neg-mul-171.7%
unpow271.7%
distribute-rgt-neg-in71.7%
Simplified71.7%
Taylor expanded in im around 0 71.7%
mul-1-neg71.7%
unpow271.7%
associate-*r/72.5%
distribute-rgt-neg-in72.5%
distribute-neg-frac72.5%
Simplified72.5%
if -5.00000000000000008e99 < re Initial program 49.7%
+-commutative49.7%
hypot-def91.2%
Simplified91.2%
add-sqr-sqrt90.5%
sqrt-unprod91.2%
*-commutative91.2%
*-commutative91.2%
swap-sqr91.2%
add-sqr-sqrt91.2%
*-commutative91.2%
metadata-eval91.2%
Applied egg-rr91.2%
associate-*l*91.2%
metadata-eval91.2%
Simplified91.2%
Final simplification88.2%
(FPCore (re im)
:precision binary64
(let* ((t_0 (* 0.5 (sqrt (* im -2.0)))))
(if (<= im -4.5e+16)
t_0
(if (<= im -1.55e-38)
(sqrt re)
(if (<= im -1.6e-120)
t_0
(if (<= im -8.5e-287)
(sqrt re)
(if (<= im 1.05e-264)
(* 0.5 (/ im (sqrt (- re))))
(if (<= im 5.5e-153) (sqrt re) (* 0.5 (sqrt (* im 2.0)))))))))))
double code(double re, double im) {
double t_0 = 0.5 * sqrt((im * -2.0));
double tmp;
if (im <= -4.5e+16) {
tmp = t_0;
} else if (im <= -1.55e-38) {
tmp = sqrt(re);
} else if (im <= -1.6e-120) {
tmp = t_0;
} else if (im <= -8.5e-287) {
tmp = sqrt(re);
} else if (im <= 1.05e-264) {
tmp = 0.5 * (im / sqrt(-re));
} else if (im <= 5.5e-153) {
tmp = sqrt(re);
} else {
tmp = 0.5 * sqrt((im * 2.0));
}
return tmp;
}
real(8) function code(re, im)
real(8), intent (in) :: re
real(8), intent (in) :: im
real(8) :: t_0
real(8) :: tmp
t_0 = 0.5d0 * sqrt((im * (-2.0d0)))
if (im <= (-4.5d+16)) then
tmp = t_0
else if (im <= (-1.55d-38)) then
tmp = sqrt(re)
else if (im <= (-1.6d-120)) then
tmp = t_0
else if (im <= (-8.5d-287)) then
tmp = sqrt(re)
else if (im <= 1.05d-264) then
tmp = 0.5d0 * (im / sqrt(-re))
else if (im <= 5.5d-153) then
tmp = sqrt(re)
else
tmp = 0.5d0 * sqrt((im * 2.0d0))
end if
code = tmp
end function
public static double code(double re, double im) {
double t_0 = 0.5 * Math.sqrt((im * -2.0));
double tmp;
if (im <= -4.5e+16) {
tmp = t_0;
} else if (im <= -1.55e-38) {
tmp = Math.sqrt(re);
} else if (im <= -1.6e-120) {
tmp = t_0;
} else if (im <= -8.5e-287) {
tmp = Math.sqrt(re);
} else if (im <= 1.05e-264) {
tmp = 0.5 * (im / Math.sqrt(-re));
} else if (im <= 5.5e-153) {
tmp = Math.sqrt(re);
} else {
tmp = 0.5 * Math.sqrt((im * 2.0));
}
return tmp;
}
def code(re, im): t_0 = 0.5 * math.sqrt((im * -2.0)) tmp = 0 if im <= -4.5e+16: tmp = t_0 elif im <= -1.55e-38: tmp = math.sqrt(re) elif im <= -1.6e-120: tmp = t_0 elif im <= -8.5e-287: tmp = math.sqrt(re) elif im <= 1.05e-264: tmp = 0.5 * (im / math.sqrt(-re)) elif im <= 5.5e-153: tmp = math.sqrt(re) else: tmp = 0.5 * math.sqrt((im * 2.0)) return tmp
function code(re, im) t_0 = Float64(0.5 * sqrt(Float64(im * -2.0))) tmp = 0.0 if (im <= -4.5e+16) tmp = t_0; elseif (im <= -1.55e-38) tmp = sqrt(re); elseif (im <= -1.6e-120) tmp = t_0; elseif (im <= -8.5e-287) tmp = sqrt(re); elseif (im <= 1.05e-264) tmp = Float64(0.5 * Float64(im / sqrt(Float64(-re)))); elseif (im <= 5.5e-153) tmp = sqrt(re); else tmp = Float64(0.5 * sqrt(Float64(im * 2.0))); end return tmp end
function tmp_2 = code(re, im) t_0 = 0.5 * sqrt((im * -2.0)); tmp = 0.0; if (im <= -4.5e+16) tmp = t_0; elseif (im <= -1.55e-38) tmp = sqrt(re); elseif (im <= -1.6e-120) tmp = t_0; elseif (im <= -8.5e-287) tmp = sqrt(re); elseif (im <= 1.05e-264) tmp = 0.5 * (im / sqrt(-re)); elseif (im <= 5.5e-153) tmp = sqrt(re); else tmp = 0.5 * sqrt((im * 2.0)); end tmp_2 = tmp; end
code[re_, im_] := Block[{t$95$0 = N[(0.5 * N[Sqrt[N[(im * -2.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]}, If[LessEqual[im, -4.5e+16], t$95$0, If[LessEqual[im, -1.55e-38], N[Sqrt[re], $MachinePrecision], If[LessEqual[im, -1.6e-120], t$95$0, If[LessEqual[im, -8.5e-287], N[Sqrt[re], $MachinePrecision], If[LessEqual[im, 1.05e-264], N[(0.5 * N[(im / N[Sqrt[(-re)], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[im, 5.5e-153], N[Sqrt[re], $MachinePrecision], N[(0.5 * N[Sqrt[N[(im * 2.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]]]]]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := 0.5 \cdot \sqrt{im \cdot -2}\\
\mathbf{if}\;im \leq -4.5 \cdot 10^{+16}:\\
\;\;\;\;t_0\\
\mathbf{elif}\;im \leq -1.55 \cdot 10^{-38}:\\
\;\;\;\;\sqrt{re}\\
\mathbf{elif}\;im \leq -1.6 \cdot 10^{-120}:\\
\;\;\;\;t_0\\
\mathbf{elif}\;im \leq -8.5 \cdot 10^{-287}:\\
\;\;\;\;\sqrt{re}\\
\mathbf{elif}\;im \leq 1.05 \cdot 10^{-264}:\\
\;\;\;\;0.5 \cdot \frac{im}{\sqrt{-re}}\\
\mathbf{elif}\;im \leq 5.5 \cdot 10^{-153}:\\
\;\;\;\;\sqrt{re}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{im \cdot 2}\\
\end{array}
\end{array}
if im < -4.5e16 or -1.54999999999999991e-38 < im < -1.6e-120Initial program 38.5%
+-commutative38.5%
hypot-def87.7%
Simplified87.7%
Taylor expanded in im around -inf 66.3%
*-commutative66.3%
Simplified66.3%
if -4.5e16 < im < -1.54999999999999991e-38 or -1.6e-120 < im < -8.5000000000000003e-287 or 1.0500000000000001e-264 < im < 5.49999999999999962e-153Initial program 47.3%
+-commutative47.3%
hypot-def77.4%
Simplified77.4%
Taylor expanded in im around 0 56.9%
associate-*r*56.9%
unpow256.9%
rem-square-sqrt58.1%
metadata-eval58.1%
*-lft-identity58.1%
Simplified58.1%
if -8.5000000000000003e-287 < im < 1.0500000000000001e-264Initial program 12.6%
+-commutative12.6%
hypot-def80.1%
Simplified80.1%
Taylor expanded in re around -inf 70.5%
associate-*r/70.5%
neg-mul-170.5%
unpow270.5%
distribute-rgt-neg-in70.5%
Simplified70.5%
frac-2neg70.5%
sqrt-div70.1%
distribute-rgt-neg-out70.1%
remove-double-neg70.1%
sqrt-unprod79.6%
add-sqr-sqrt80.6%
Applied egg-rr80.6%
if 5.49999999999999962e-153 < im Initial program 47.0%
+-commutative47.0%
hypot-def80.0%
Simplified80.0%
Taylor expanded in re around 0 65.9%
*-commutative65.9%
Simplified65.9%
Final simplification64.6%
(FPCore (re im)
:precision binary64
(if (<= im -1.16e-121)
(* 0.5 (sqrt (* 2.0 (- re im))))
(if (<= im -8e-287)
(sqrt re)
(if (<= im 1.5e-265)
(* 0.5 (/ im (sqrt (- re))))
(if (<= im 5.8e-153) (sqrt re) (* 0.5 (sqrt (* 2.0 (+ re im)))))))))
double code(double re, double im) {
double tmp;
if (im <= -1.16e-121) {
tmp = 0.5 * sqrt((2.0 * (re - im)));
} else if (im <= -8e-287) {
tmp = sqrt(re);
} else if (im <= 1.5e-265) {
tmp = 0.5 * (im / sqrt(-re));
} else if (im <= 5.8e-153) {
tmp = sqrt(re);
} else {
tmp = 0.5 * sqrt((2.0 * (re + im)));
}
return tmp;
}
real(8) function code(re, im)
real(8), intent (in) :: re
real(8), intent (in) :: im
real(8) :: tmp
if (im <= (-1.16d-121)) then
tmp = 0.5d0 * sqrt((2.0d0 * (re - im)))
else if (im <= (-8d-287)) then
tmp = sqrt(re)
else if (im <= 1.5d-265) then
tmp = 0.5d0 * (im / sqrt(-re))
else if (im <= 5.8d-153) then
tmp = sqrt(re)
else
tmp = 0.5d0 * sqrt((2.0d0 * (re + im)))
end if
code = tmp
end function
public static double code(double re, double im) {
double tmp;
if (im <= -1.16e-121) {
tmp = 0.5 * Math.sqrt((2.0 * (re - im)));
} else if (im <= -8e-287) {
tmp = Math.sqrt(re);
} else if (im <= 1.5e-265) {
tmp = 0.5 * (im / Math.sqrt(-re));
} else if (im <= 5.8e-153) {
tmp = Math.sqrt(re);
} else {
tmp = 0.5 * Math.sqrt((2.0 * (re + im)));
}
return tmp;
}
def code(re, im): tmp = 0 if im <= -1.16e-121: tmp = 0.5 * math.sqrt((2.0 * (re - im))) elif im <= -8e-287: tmp = math.sqrt(re) elif im <= 1.5e-265: tmp = 0.5 * (im / math.sqrt(-re)) elif im <= 5.8e-153: tmp = math.sqrt(re) else: tmp = 0.5 * math.sqrt((2.0 * (re + im))) return tmp
function code(re, im) tmp = 0.0 if (im <= -1.16e-121) tmp = Float64(0.5 * sqrt(Float64(2.0 * Float64(re - im)))); elseif (im <= -8e-287) tmp = sqrt(re); elseif (im <= 1.5e-265) tmp = Float64(0.5 * Float64(im / sqrt(Float64(-re)))); elseif (im <= 5.8e-153) tmp = sqrt(re); else tmp = Float64(0.5 * sqrt(Float64(2.0 * Float64(re + im)))); end return tmp end
function tmp_2 = code(re, im) tmp = 0.0; if (im <= -1.16e-121) tmp = 0.5 * sqrt((2.0 * (re - im))); elseif (im <= -8e-287) tmp = sqrt(re); elseif (im <= 1.5e-265) tmp = 0.5 * (im / sqrt(-re)); elseif (im <= 5.8e-153) tmp = sqrt(re); else tmp = 0.5 * sqrt((2.0 * (re + im))); end tmp_2 = tmp; end
code[re_, im_] := If[LessEqual[im, -1.16e-121], N[(0.5 * N[Sqrt[N[(2.0 * N[(re - im), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], If[LessEqual[im, -8e-287], N[Sqrt[re], $MachinePrecision], If[LessEqual[im, 1.5e-265], N[(0.5 * N[(im / N[Sqrt[(-re)], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[im, 5.8e-153], N[Sqrt[re], $MachinePrecision], N[(0.5 * N[Sqrt[N[(2.0 * N[(re + im), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]]]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;im \leq -1.16 \cdot 10^{-121}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re - im\right)}\\
\mathbf{elif}\;im \leq -8 \cdot 10^{-287}:\\
\;\;\;\;\sqrt{re}\\
\mathbf{elif}\;im \leq 1.5 \cdot 10^{-265}:\\
\;\;\;\;0.5 \cdot \frac{im}{\sqrt{-re}}\\
\mathbf{elif}\;im \leq 5.8 \cdot 10^{-153}:\\
\;\;\;\;\sqrt{re}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\right)}\\
\end{array}
\end{array}
if im < -1.1600000000000001e-121Initial program 42.6%
+-commutative42.6%
hypot-def88.5%
Simplified88.5%
Taylor expanded in im around -inf 65.0%
mul-1-neg65.0%
sub-neg65.0%
Simplified65.0%
if -1.1600000000000001e-121 < im < -8.00000000000000017e-287 or 1.4999999999999999e-265 < im < 5.80000000000000004e-153Initial program 42.3%
+-commutative42.3%
hypot-def73.1%
Simplified73.1%
Taylor expanded in im around 0 55.7%
associate-*r*55.7%
unpow255.7%
rem-square-sqrt56.8%
metadata-eval56.8%
*-lft-identity56.8%
Simplified56.8%
if -8.00000000000000017e-287 < im < 1.4999999999999999e-265Initial program 12.6%
+-commutative12.6%
hypot-def80.1%
Simplified80.1%
Taylor expanded in re around -inf 70.5%
associate-*r/70.5%
neg-mul-170.5%
unpow270.5%
distribute-rgt-neg-in70.5%
Simplified70.5%
frac-2neg70.5%
sqrt-div70.1%
distribute-rgt-neg-out70.1%
remove-double-neg70.1%
sqrt-unprod79.6%
add-sqr-sqrt80.6%
Applied egg-rr80.6%
if 5.80000000000000004e-153 < im Initial program 47.0%
+-commutative47.0%
hypot-def80.0%
Simplified80.0%
Taylor expanded in re around 0 66.4%
distribute-lft-out66.4%
+-commutative66.4%
*-commutative66.4%
+-commutative66.4%
Simplified66.4%
Final simplification64.5%
(FPCore (re im)
:precision binary64
(let* ((t_0 (* 0.5 (sqrt (* im -2.0)))))
(if (<= im -5.2e+17)
t_0
(if (<= im -6e-41)
(sqrt re)
(if (<= im -5.5e-122)
t_0
(if (<= im 5.8e-153) (sqrt re) (* 0.5 (sqrt (* im 2.0)))))))))
double code(double re, double im) {
double t_0 = 0.5 * sqrt((im * -2.0));
double tmp;
if (im <= -5.2e+17) {
tmp = t_0;
} else if (im <= -6e-41) {
tmp = sqrt(re);
} else if (im <= -5.5e-122) {
tmp = t_0;
} else if (im <= 5.8e-153) {
tmp = sqrt(re);
} else {
tmp = 0.5 * sqrt((im * 2.0));
}
return tmp;
}
real(8) function code(re, im)
real(8), intent (in) :: re
real(8), intent (in) :: im
real(8) :: t_0
real(8) :: tmp
t_0 = 0.5d0 * sqrt((im * (-2.0d0)))
if (im <= (-5.2d+17)) then
tmp = t_0
else if (im <= (-6d-41)) then
tmp = sqrt(re)
else if (im <= (-5.5d-122)) then
tmp = t_0
else if (im <= 5.8d-153) then
tmp = sqrt(re)
else
tmp = 0.5d0 * sqrt((im * 2.0d0))
end if
code = tmp
end function
public static double code(double re, double im) {
double t_0 = 0.5 * Math.sqrt((im * -2.0));
double tmp;
if (im <= -5.2e+17) {
tmp = t_0;
} else if (im <= -6e-41) {
tmp = Math.sqrt(re);
} else if (im <= -5.5e-122) {
tmp = t_0;
} else if (im <= 5.8e-153) {
tmp = Math.sqrt(re);
} else {
tmp = 0.5 * Math.sqrt((im * 2.0));
}
return tmp;
}
def code(re, im): t_0 = 0.5 * math.sqrt((im * -2.0)) tmp = 0 if im <= -5.2e+17: tmp = t_0 elif im <= -6e-41: tmp = math.sqrt(re) elif im <= -5.5e-122: tmp = t_0 elif im <= 5.8e-153: tmp = math.sqrt(re) else: tmp = 0.5 * math.sqrt((im * 2.0)) return tmp
function code(re, im) t_0 = Float64(0.5 * sqrt(Float64(im * -2.0))) tmp = 0.0 if (im <= -5.2e+17) tmp = t_0; elseif (im <= -6e-41) tmp = sqrt(re); elseif (im <= -5.5e-122) tmp = t_0; elseif (im <= 5.8e-153) tmp = sqrt(re); else tmp = Float64(0.5 * sqrt(Float64(im * 2.0))); end return tmp end
function tmp_2 = code(re, im) t_0 = 0.5 * sqrt((im * -2.0)); tmp = 0.0; if (im <= -5.2e+17) tmp = t_0; elseif (im <= -6e-41) tmp = sqrt(re); elseif (im <= -5.5e-122) tmp = t_0; elseif (im <= 5.8e-153) tmp = sqrt(re); else tmp = 0.5 * sqrt((im * 2.0)); end tmp_2 = tmp; end
code[re_, im_] := Block[{t$95$0 = N[(0.5 * N[Sqrt[N[(im * -2.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]}, If[LessEqual[im, -5.2e+17], t$95$0, If[LessEqual[im, -6e-41], N[Sqrt[re], $MachinePrecision], If[LessEqual[im, -5.5e-122], t$95$0, If[LessEqual[im, 5.8e-153], N[Sqrt[re], $MachinePrecision], N[(0.5 * N[Sqrt[N[(im * 2.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]]]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := 0.5 \cdot \sqrt{im \cdot -2}\\
\mathbf{if}\;im \leq -5.2 \cdot 10^{+17}:\\
\;\;\;\;t_0\\
\mathbf{elif}\;im \leq -6 \cdot 10^{-41}:\\
\;\;\;\;\sqrt{re}\\
\mathbf{elif}\;im \leq -5.5 \cdot 10^{-122}:\\
\;\;\;\;t_0\\
\mathbf{elif}\;im \leq 5.8 \cdot 10^{-153}:\\
\;\;\;\;\sqrt{re}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{im \cdot 2}\\
\end{array}
\end{array}
if im < -5.2e17 or -5.99999999999999978e-41 < im < -5.50000000000000053e-122Initial program 38.5%
+-commutative38.5%
hypot-def87.7%
Simplified87.7%
Taylor expanded in im around -inf 66.3%
*-commutative66.3%
Simplified66.3%
if -5.2e17 < im < -5.99999999999999978e-41 or -5.50000000000000053e-122 < im < 5.80000000000000004e-153Initial program 42.7%
+-commutative42.7%
hypot-def77.7%
Simplified77.7%
Taylor expanded in im around 0 50.7%
associate-*r*50.7%
unpow250.7%
rem-square-sqrt51.7%
metadata-eval51.7%
*-lft-identity51.7%
Simplified51.7%
if 5.80000000000000004e-153 < im Initial program 47.0%
+-commutative47.0%
hypot-def80.0%
Simplified80.0%
Taylor expanded in re around 0 65.9%
*-commutative65.9%
Simplified65.9%
Final simplification61.8%
(FPCore (re im)
:precision binary64
(if (<= im -2.35e-122)
(* 0.5 (sqrt (* 2.0 (- re im))))
(if (<= im -8e-287)
(sqrt re)
(if (<= im 2.3e-263)
(* 0.5 (/ im (sqrt (- re))))
(if (<= im 5.8e-153) (sqrt re) (* 0.5 (sqrt (* im 2.0))))))))
double code(double re, double im) {
double tmp;
if (im <= -2.35e-122) {
tmp = 0.5 * sqrt((2.0 * (re - im)));
} else if (im <= -8e-287) {
tmp = sqrt(re);
} else if (im <= 2.3e-263) {
tmp = 0.5 * (im / sqrt(-re));
} else if (im <= 5.8e-153) {
tmp = sqrt(re);
} else {
tmp = 0.5 * sqrt((im * 2.0));
}
return tmp;
}
real(8) function code(re, im)
real(8), intent (in) :: re
real(8), intent (in) :: im
real(8) :: tmp
if (im <= (-2.35d-122)) then
tmp = 0.5d0 * sqrt((2.0d0 * (re - im)))
else if (im <= (-8d-287)) then
tmp = sqrt(re)
else if (im <= 2.3d-263) then
tmp = 0.5d0 * (im / sqrt(-re))
else if (im <= 5.8d-153) then
tmp = sqrt(re)
else
tmp = 0.5d0 * sqrt((im * 2.0d0))
end if
code = tmp
end function
public static double code(double re, double im) {
double tmp;
if (im <= -2.35e-122) {
tmp = 0.5 * Math.sqrt((2.0 * (re - im)));
} else if (im <= -8e-287) {
tmp = Math.sqrt(re);
} else if (im <= 2.3e-263) {
tmp = 0.5 * (im / Math.sqrt(-re));
} else if (im <= 5.8e-153) {
tmp = Math.sqrt(re);
} else {
tmp = 0.5 * Math.sqrt((im * 2.0));
}
return tmp;
}
def code(re, im): tmp = 0 if im <= -2.35e-122: tmp = 0.5 * math.sqrt((2.0 * (re - im))) elif im <= -8e-287: tmp = math.sqrt(re) elif im <= 2.3e-263: tmp = 0.5 * (im / math.sqrt(-re)) elif im <= 5.8e-153: tmp = math.sqrt(re) else: tmp = 0.5 * math.sqrt((im * 2.0)) return tmp
function code(re, im) tmp = 0.0 if (im <= -2.35e-122) tmp = Float64(0.5 * sqrt(Float64(2.0 * Float64(re - im)))); elseif (im <= -8e-287) tmp = sqrt(re); elseif (im <= 2.3e-263) tmp = Float64(0.5 * Float64(im / sqrt(Float64(-re)))); elseif (im <= 5.8e-153) tmp = sqrt(re); else tmp = Float64(0.5 * sqrt(Float64(im * 2.0))); end return tmp end
function tmp_2 = code(re, im) tmp = 0.0; if (im <= -2.35e-122) tmp = 0.5 * sqrt((2.0 * (re - im))); elseif (im <= -8e-287) tmp = sqrt(re); elseif (im <= 2.3e-263) tmp = 0.5 * (im / sqrt(-re)); elseif (im <= 5.8e-153) tmp = sqrt(re); else tmp = 0.5 * sqrt((im * 2.0)); end tmp_2 = tmp; end
code[re_, im_] := If[LessEqual[im, -2.35e-122], N[(0.5 * N[Sqrt[N[(2.0 * N[(re - im), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], If[LessEqual[im, -8e-287], N[Sqrt[re], $MachinePrecision], If[LessEqual[im, 2.3e-263], N[(0.5 * N[(im / N[Sqrt[(-re)], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[im, 5.8e-153], N[Sqrt[re], $MachinePrecision], N[(0.5 * N[Sqrt[N[(im * 2.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]]]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;im \leq -2.35 \cdot 10^{-122}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re - im\right)}\\
\mathbf{elif}\;im \leq -8 \cdot 10^{-287}:\\
\;\;\;\;\sqrt{re}\\
\mathbf{elif}\;im \leq 2.3 \cdot 10^{-263}:\\
\;\;\;\;0.5 \cdot \frac{im}{\sqrt{-re}}\\
\mathbf{elif}\;im \leq 5.8 \cdot 10^{-153}:\\
\;\;\;\;\sqrt{re}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{im \cdot 2}\\
\end{array}
\end{array}
if im < -2.35e-122Initial program 42.6%
+-commutative42.6%
hypot-def88.5%
Simplified88.5%
Taylor expanded in im around -inf 65.0%
mul-1-neg65.0%
sub-neg65.0%
Simplified65.0%
if -2.35e-122 < im < -8.00000000000000017e-287 or 2.30000000000000003e-263 < im < 5.80000000000000004e-153Initial program 42.3%
+-commutative42.3%
hypot-def73.1%
Simplified73.1%
Taylor expanded in im around 0 55.7%
associate-*r*55.7%
unpow255.7%
rem-square-sqrt56.8%
metadata-eval56.8%
*-lft-identity56.8%
Simplified56.8%
if -8.00000000000000017e-287 < im < 2.30000000000000003e-263Initial program 12.6%
+-commutative12.6%
hypot-def80.1%
Simplified80.1%
Taylor expanded in re around -inf 70.5%
associate-*r/70.5%
neg-mul-170.5%
unpow270.5%
distribute-rgt-neg-in70.5%
Simplified70.5%
frac-2neg70.5%
sqrt-div70.1%
distribute-rgt-neg-out70.1%
remove-double-neg70.1%
sqrt-unprod79.6%
add-sqr-sqrt80.6%
Applied egg-rr80.6%
if 5.80000000000000004e-153 < im Initial program 47.0%
+-commutative47.0%
hypot-def80.0%
Simplified80.0%
Taylor expanded in re around 0 65.9%
*-commutative65.9%
Simplified65.9%
Final simplification64.3%
(FPCore (re im) :precision binary64 (if (<= re 4.5e-96) (* 0.5 (sqrt (* im -2.0))) (sqrt re)))
double code(double re, double im) {
double tmp;
if (re <= 4.5e-96) {
tmp = 0.5 * sqrt((im * -2.0));
} else {
tmp = sqrt(re);
}
return tmp;
}
real(8) function code(re, im)
real(8), intent (in) :: re
real(8), intent (in) :: im
real(8) :: tmp
if (re <= 4.5d-96) then
tmp = 0.5d0 * sqrt((im * (-2.0d0)))
else
tmp = sqrt(re)
end if
code = tmp
end function
public static double code(double re, double im) {
double tmp;
if (re <= 4.5e-96) {
tmp = 0.5 * Math.sqrt((im * -2.0));
} else {
tmp = Math.sqrt(re);
}
return tmp;
}
def code(re, im): tmp = 0 if re <= 4.5e-96: tmp = 0.5 * math.sqrt((im * -2.0)) else: tmp = math.sqrt(re) return tmp
function code(re, im) tmp = 0.0 if (re <= 4.5e-96) tmp = Float64(0.5 * sqrt(Float64(im * -2.0))); else tmp = sqrt(re); end return tmp end
function tmp_2 = code(re, im) tmp = 0.0; if (re <= 4.5e-96) tmp = 0.5 * sqrt((im * -2.0)); else tmp = sqrt(re); end tmp_2 = tmp; end
code[re_, im_] := If[LessEqual[re, 4.5e-96], N[(0.5 * N[Sqrt[N[(im * -2.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[Sqrt[re], $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;re \leq 4.5 \cdot 10^{-96}:\\
\;\;\;\;0.5 \cdot \sqrt{im \cdot -2}\\
\mathbf{else}:\\
\;\;\;\;\sqrt{re}\\
\end{array}
\end{array}
if re < 4.5e-96Initial program 42.4%
+-commutative42.4%
hypot-def71.2%
Simplified71.2%
Taylor expanded in im around -inf 28.0%
*-commutative28.0%
Simplified28.0%
if 4.5e-96 < re Initial program 44.4%
+-commutative44.4%
hypot-def100.0%
Simplified100.0%
Taylor expanded in im around 0 71.4%
associate-*r*71.4%
unpow271.4%
rem-square-sqrt72.8%
metadata-eval72.8%
*-lft-identity72.8%
Simplified72.8%
Final simplification44.3%
(FPCore (re im) :precision binary64 (sqrt re))
double code(double re, double im) {
return sqrt(re);
}
real(8) function code(re, im)
real(8), intent (in) :: re
real(8), intent (in) :: im
code = sqrt(re)
end function
public static double code(double re, double im) {
return Math.sqrt(re);
}
def code(re, im): return math.sqrt(re)
function code(re, im) return sqrt(re) end
function tmp = code(re, im) tmp = sqrt(re); end
code[re_, im_] := N[Sqrt[re], $MachinePrecision]
\begin{array}{l}
\\
\sqrt{re}
\end{array}
Initial program 43.1%
+-commutative43.1%
hypot-def81.7%
Simplified81.7%
Taylor expanded in im around 0 28.1%
associate-*r*28.1%
unpow228.1%
rem-square-sqrt28.6%
metadata-eval28.6%
*-lft-identity28.6%
Simplified28.6%
Final simplification28.6%
(FPCore (re im)
:precision binary64
(let* ((t_0 (sqrt (+ (* re re) (* im im)))))
(if (< re 0.0)
(* 0.5 (* (sqrt 2.0) (sqrt (/ (* im im) (- t_0 re)))))
(* 0.5 (sqrt (* 2.0 (+ t_0 re)))))))
double code(double re, double im) {
double t_0 = sqrt(((re * re) + (im * im)));
double tmp;
if (re < 0.0) {
tmp = 0.5 * (sqrt(2.0) * sqrt(((im * im) / (t_0 - re))));
} else {
tmp = 0.5 * sqrt((2.0 * (t_0 + re)));
}
return tmp;
}
real(8) function code(re, im)
real(8), intent (in) :: re
real(8), intent (in) :: im
real(8) :: t_0
real(8) :: tmp
t_0 = sqrt(((re * re) + (im * im)))
if (re < 0.0d0) then
tmp = 0.5d0 * (sqrt(2.0d0) * sqrt(((im * im) / (t_0 - re))))
else
tmp = 0.5d0 * sqrt((2.0d0 * (t_0 + re)))
end if
code = tmp
end function
public static double code(double re, double im) {
double t_0 = Math.sqrt(((re * re) + (im * im)));
double tmp;
if (re < 0.0) {
tmp = 0.5 * (Math.sqrt(2.0) * Math.sqrt(((im * im) / (t_0 - re))));
} else {
tmp = 0.5 * Math.sqrt((2.0 * (t_0 + re)));
}
return tmp;
}
def code(re, im): t_0 = math.sqrt(((re * re) + (im * im))) tmp = 0 if re < 0.0: tmp = 0.5 * (math.sqrt(2.0) * math.sqrt(((im * im) / (t_0 - re)))) else: tmp = 0.5 * math.sqrt((2.0 * (t_0 + re))) return tmp
function code(re, im) t_0 = sqrt(Float64(Float64(re * re) + Float64(im * im))) tmp = 0.0 if (re < 0.0) tmp = Float64(0.5 * Float64(sqrt(2.0) * sqrt(Float64(Float64(im * im) / Float64(t_0 - re))))); else tmp = Float64(0.5 * sqrt(Float64(2.0 * Float64(t_0 + re)))); end return tmp end
function tmp_2 = code(re, im) t_0 = sqrt(((re * re) + (im * im))); tmp = 0.0; if (re < 0.0) tmp = 0.5 * (sqrt(2.0) * sqrt(((im * im) / (t_0 - re)))); else tmp = 0.5 * sqrt((2.0 * (t_0 + re))); end tmp_2 = tmp; end
code[re_, im_] := Block[{t$95$0 = N[Sqrt[N[(N[(re * re), $MachinePrecision] + N[(im * im), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]}, If[Less[re, 0.0], N[(0.5 * N[(N[Sqrt[2.0], $MachinePrecision] * N[Sqrt[N[(N[(im * im), $MachinePrecision] / N[(t$95$0 - re), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(0.5 * N[Sqrt[N[(2.0 * N[(t$95$0 + re), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \sqrt{re \cdot re + im \cdot im}\\
\mathbf{if}\;re < 0:\\
\;\;\;\;0.5 \cdot \left(\sqrt{2} \cdot \sqrt{\frac{im \cdot im}{t_0 - re}}\right)\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(t_0 + re\right)}\\
\end{array}
\end{array}
herbie shell --seed 2023178
(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)))))