
(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)
use fmin_fmax_functions
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]
0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
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)
use fmin_fmax_functions
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]
0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
(FPCore (re im)
:precision binary64
(if (<=
(* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re))))
0.0)
(* 0.5 (sqrt (* -1.0 (/ (pow im 2.0) re))))
(* 0.5 (sqrt (* 2.0 (+ (hypot re im) re))))))double code(double re, double im) {
double tmp;
if ((0.5 * sqrt((2.0 * (sqrt(((re * re) + (im * im))) + re)))) <= 0.0) {
tmp = 0.5 * sqrt((-1.0 * (pow(im, 2.0) / re)));
} else {
tmp = 0.5 * sqrt((2.0 * (hypot(re, im) + re)));
}
return tmp;
}
public static double code(double re, double im) {
double tmp;
if ((0.5 * Math.sqrt((2.0 * (Math.sqrt(((re * re) + (im * im))) + re)))) <= 0.0) {
tmp = 0.5 * Math.sqrt((-1.0 * (Math.pow(im, 2.0) / re)));
} else {
tmp = 0.5 * Math.sqrt((2.0 * (Math.hypot(re, im) + re)));
}
return tmp;
}
def code(re, im): tmp = 0 if (0.5 * math.sqrt((2.0 * (math.sqrt(((re * re) + (im * im))) + re)))) <= 0.0: tmp = 0.5 * math.sqrt((-1.0 * (math.pow(im, 2.0) / re))) else: tmp = 0.5 * math.sqrt((2.0 * (math.hypot(re, im) + re))) return tmp
function code(re, im) tmp = 0.0 if (Float64(0.5 * sqrt(Float64(2.0 * Float64(sqrt(Float64(Float64(re * re) + Float64(im * im))) + re)))) <= 0.0) tmp = Float64(0.5 * sqrt(Float64(-1.0 * Float64((im ^ 2.0) / re)))); else tmp = Float64(0.5 * sqrt(Float64(2.0 * Float64(hypot(re, im) + re)))); end return tmp end
function tmp_2 = code(re, im) tmp = 0.0; if ((0.5 * sqrt((2.0 * (sqrt(((re * re) + (im * im))) + re)))) <= 0.0) tmp = 0.5 * sqrt((-1.0 * ((im ^ 2.0) / re))); else tmp = 0.5 * sqrt((2.0 * (hypot(re, im) + re))); end tmp_2 = tmp; end
code[re_, im_] := If[LessEqual[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], 0.0], N[(0.5 * N[Sqrt[N[(-1.0 * N[(N[Power[im, 2.0], $MachinePrecision] / re), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[(0.5 * N[Sqrt[N[(2.0 * N[(N[Sqrt[re ^ 2 + im ^ 2], $MachinePrecision] + re), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\mathbf{if}\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \leq 0:\\
\;\;\;\;0.5 \cdot \sqrt{-1 \cdot \frac{{im}^{2}}{re}}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\mathsf{hypot}\left(re, im\right) + re\right)}\\
\end{array}
if (*.f64 #s(literal 1/2 binary64) (sqrt.f64 (*.f64 #s(literal 2 binary64) (+.f64 (sqrt.f64 (+.f64 (*.f64 re re) (*.f64 im im))) re)))) < 0.0Initial program 41.2%
Taylor expanded in im around -inf
lower-*.f6425.9%
Applied rewrites25.9%
Taylor expanded in im around inf
lower-*.f6426.9%
Applied rewrites26.9%
Taylor expanded in re around -inf
lower-*.f64N/A
lower-/.f64N/A
lower-pow.f6414.6%
Applied rewrites14.6%
if 0.0 < (*.f64 #s(literal 1/2 binary64) (sqrt.f64 (*.f64 #s(literal 2 binary64) (+.f64 (sqrt.f64 (+.f64 (*.f64 re re) (*.f64 im im))) re)))) Initial program 41.2%
lift-sqrt.f64N/A
sqrt-fabs-revN/A
lift-sqrt.f64N/A
rem-sqrt-square-revN/A
lift-sqrt.f64N/A
lift-sqrt.f64N/A
rem-square-sqrtN/A
lift-+.f64N/A
add-flipN/A
sub-flipN/A
lift-*.f64N/A
lift-*.f64N/A
distribute-rgt-neg-inN/A
distribute-lft-neg-outN/A
sqr-neg-revN/A
lower-hypot.f6479.7%
Applied rewrites79.7%
(FPCore (re im) :precision binary64 (* 0.5 (sqrt (* 2.0 (+ (hypot re im) re)))))
double code(double re, double im) {
return 0.5 * sqrt((2.0 * (hypot(re, im) + re)));
}
public static double code(double re, double im) {
return 0.5 * Math.sqrt((2.0 * (Math.hypot(re, im) + re)));
}
def code(re, im): return 0.5 * math.sqrt((2.0 * (math.hypot(re, im) + re)))
function code(re, im) return Float64(0.5 * sqrt(Float64(2.0 * Float64(hypot(re, im) + re)))) end
function tmp = code(re, im) tmp = 0.5 * sqrt((2.0 * (hypot(re, im) + re))); end
code[re_, im_] := N[(0.5 * N[Sqrt[N[(2.0 * N[(N[Sqrt[re ^ 2 + im ^ 2], $MachinePrecision] + re), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
0.5 \cdot \sqrt{2 \cdot \left(\mathsf{hypot}\left(re, im\right) + re\right)}
Initial program 41.2%
lift-sqrt.f64N/A
sqrt-fabs-revN/A
lift-sqrt.f64N/A
rem-sqrt-square-revN/A
lift-sqrt.f64N/A
lift-sqrt.f64N/A
rem-square-sqrtN/A
lift-+.f64N/A
add-flipN/A
sub-flipN/A
lift-*.f64N/A
lift-*.f64N/A
distribute-rgt-neg-inN/A
distribute-lft-neg-outN/A
sqr-neg-revN/A
lower-hypot.f6479.7%
Applied rewrites79.7%
(FPCore (re im)
:precision binary64
(if (<= (fabs im) 1.25e-132)
(* 0.5 (sqrt (* 4.0 re)))
(if (<= (fabs im) 4.6e+144)
(*
(sqrt (* (+ (sqrt (fma (fabs im) (fabs im) (* re re))) re) 2.0))
0.5)
(* (* 0.5 (sqrt 2.0)) (sqrt (fabs (+ (- (fabs im)) re)))))))double code(double re, double im) {
double tmp;
if (fabs(im) <= 1.25e-132) {
tmp = 0.5 * sqrt((4.0 * re));
} else if (fabs(im) <= 4.6e+144) {
tmp = sqrt(((sqrt(fma(fabs(im), fabs(im), (re * re))) + re) * 2.0)) * 0.5;
} else {
tmp = (0.5 * sqrt(2.0)) * sqrt(fabs((-fabs(im) + re)));
}
return tmp;
}
function code(re, im) tmp = 0.0 if (abs(im) <= 1.25e-132) tmp = Float64(0.5 * sqrt(Float64(4.0 * re))); elseif (abs(im) <= 4.6e+144) tmp = Float64(sqrt(Float64(Float64(sqrt(fma(abs(im), abs(im), Float64(re * re))) + re) * 2.0)) * 0.5); else tmp = Float64(Float64(0.5 * sqrt(2.0)) * sqrt(abs(Float64(Float64(-abs(im)) + re)))); end return tmp end
code[re_, im_] := If[LessEqual[N[Abs[im], $MachinePrecision], 1.25e-132], N[(0.5 * N[Sqrt[N[(4.0 * re), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], If[LessEqual[N[Abs[im], $MachinePrecision], 4.6e+144], N[(N[Sqrt[N[(N[(N[Sqrt[N[(N[Abs[im], $MachinePrecision] * N[Abs[im], $MachinePrecision] + N[(re * re), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] + re), $MachinePrecision] * 2.0), $MachinePrecision]], $MachinePrecision] * 0.5), $MachinePrecision], N[(N[(0.5 * N[Sqrt[2.0], $MachinePrecision]), $MachinePrecision] * N[Sqrt[N[Abs[N[((-N[Abs[im], $MachinePrecision]) + re), $MachinePrecision]], $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\mathbf{if}\;\left|im\right| \leq 1.25 \cdot 10^{-132}:\\
\;\;\;\;0.5 \cdot \sqrt{4 \cdot re}\\
\mathbf{elif}\;\left|im\right| \leq 4.6 \cdot 10^{+144}:\\
\;\;\;\;\sqrt{\left(\sqrt{\mathsf{fma}\left(\left|im\right|, \left|im\right|, re \cdot re\right)} + re\right) \cdot 2} \cdot 0.5\\
\mathbf{else}:\\
\;\;\;\;\left(0.5 \cdot \sqrt{2}\right) \cdot \sqrt{\left|\left(-\left|im\right|\right) + re\right|}\\
\end{array}
if im < 1.25e-132Initial program 41.2%
Taylor expanded in im around -inf
lower-*.f6425.9%
Applied rewrites25.9%
Taylor expanded in im around inf
lower-*.f6426.9%
Applied rewrites26.9%
Taylor expanded in re around inf
lower-*.f6426.3%
Applied rewrites26.3%
if 1.25e-132 < im < 4.6000000000000003e144Initial program 41.2%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6441.2%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6441.2%
lift-+.f64N/A
+-commutativeN/A
lift-*.f64N/A
lower-fma.f6441.2%
Applied rewrites41.2%
if 4.6000000000000003e144 < im Initial program 41.2%
Taylor expanded in im around -inf
lower-*.f6429.5%
Applied rewrites29.5%
lift-*.f64N/A
lift-sqrt.f64N/A
lift-*.f64N/A
sqrt-prodN/A
associate-*r*N/A
lower-*.f64N/A
lower-*.f64N/A
metadata-evalN/A
lower-sqrt.f64N/A
lower-sqrt.f64N/A
lower-fabs.f6455.7%
Applied rewrites55.7%
(FPCore (re im)
:precision binary64
(if (<= (fabs im) 1.25e-132)
(* 0.5 (sqrt (* 4.0 re)))
(if (<= (fabs im) 4.6e+144)
(*
0.7071067811865476
(sqrt (fabs (+ (sqrt (fma (fabs im) (fabs im) (* re re))) re))))
(* (* 0.5 (sqrt 2.0)) (sqrt (fabs (+ (- (fabs im)) re)))))))double code(double re, double im) {
double tmp;
if (fabs(im) <= 1.25e-132) {
tmp = 0.5 * sqrt((4.0 * re));
} else if (fabs(im) <= 4.6e+144) {
tmp = 0.7071067811865476 * sqrt(fabs((sqrt(fma(fabs(im), fabs(im), (re * re))) + re)));
} else {
tmp = (0.5 * sqrt(2.0)) * sqrt(fabs((-fabs(im) + re)));
}
return tmp;
}
function code(re, im) tmp = 0.0 if (abs(im) <= 1.25e-132) tmp = Float64(0.5 * sqrt(Float64(4.0 * re))); elseif (abs(im) <= 4.6e+144) tmp = Float64(0.7071067811865476 * sqrt(abs(Float64(sqrt(fma(abs(im), abs(im), Float64(re * re))) + re)))); else tmp = Float64(Float64(0.5 * sqrt(2.0)) * sqrt(abs(Float64(Float64(-abs(im)) + re)))); end return tmp end
code[re_, im_] := If[LessEqual[N[Abs[im], $MachinePrecision], 1.25e-132], N[(0.5 * N[Sqrt[N[(4.0 * re), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], If[LessEqual[N[Abs[im], $MachinePrecision], 4.6e+144], N[(0.7071067811865476 * N[Sqrt[N[Abs[N[(N[Sqrt[N[(N[Abs[im], $MachinePrecision] * N[Abs[im], $MachinePrecision] + N[(re * re), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] + re), $MachinePrecision]], $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[(N[(0.5 * N[Sqrt[2.0], $MachinePrecision]), $MachinePrecision] * N[Sqrt[N[Abs[N[((-N[Abs[im], $MachinePrecision]) + re), $MachinePrecision]], $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\mathbf{if}\;\left|im\right| \leq 1.25 \cdot 10^{-132}:\\
\;\;\;\;0.5 \cdot \sqrt{4 \cdot re}\\
\mathbf{elif}\;\left|im\right| \leq 4.6 \cdot 10^{+144}:\\
\;\;\;\;0.7071067811865476 \cdot \sqrt{\left|\sqrt{\mathsf{fma}\left(\left|im\right|, \left|im\right|, re \cdot re\right)} + re\right|}\\
\mathbf{else}:\\
\;\;\;\;\left(0.5 \cdot \sqrt{2}\right) \cdot \sqrt{\left|\left(-\left|im\right|\right) + re\right|}\\
\end{array}
if im < 1.25e-132Initial program 41.2%
Taylor expanded in im around -inf
lower-*.f6425.9%
Applied rewrites25.9%
Taylor expanded in im around inf
lower-*.f6426.9%
Applied rewrites26.9%
Taylor expanded in re around inf
lower-*.f6426.3%
Applied rewrites26.3%
if 1.25e-132 < im < 4.6000000000000003e144Initial program 41.2%
lift-*.f64N/A
lift-sqrt.f64N/A
lift-*.f64N/A
sqrt-prodN/A
associate-*r*N/A
lower-*.f64N/A
lower-*.f64N/A
metadata-evalN/A
lower-sqrt.f64N/A
lower-sqrt.f64N/A
lower-fabs.f6441.3%
lift-+.f64N/A
+-commutativeN/A
lift-*.f64N/A
lower-fma.f6441.3%
Applied rewrites41.3%
Evaluated real constant41.3%
if 4.6000000000000003e144 < im Initial program 41.2%
Taylor expanded in im around -inf
lower-*.f6429.5%
Applied rewrites29.5%
lift-*.f64N/A
lift-sqrt.f64N/A
lift-*.f64N/A
sqrt-prodN/A
associate-*r*N/A
lower-*.f64N/A
lower-*.f64N/A
metadata-evalN/A
lower-sqrt.f64N/A
lower-sqrt.f64N/A
lower-fabs.f6455.7%
Applied rewrites55.7%
(FPCore (re im)
:precision binary64
(if (<= re -4.2e+222)
(* (sqrt (+ (fabs im) (fabs im))) 0.0)
(if (<= re 1.2e+79)
(* (sqrt (* (+ (fabs im) re) 2.0)) 0.5)
(* 0.5 (sqrt (* 4.0 re))))))double code(double re, double im) {
double tmp;
if (re <= -4.2e+222) {
tmp = sqrt((fabs(im) + fabs(im))) * 0.0;
} else if (re <= 1.2e+79) {
tmp = sqrt(((fabs(im) + re) * 2.0)) * 0.5;
} else {
tmp = 0.5 * sqrt((4.0 * re));
}
return tmp;
}
real(8) function code(re, im)
use fmin_fmax_functions
real(8), intent (in) :: re
real(8), intent (in) :: im
real(8) :: tmp
if (re <= (-4.2d+222)) then
tmp = sqrt((abs(im) + abs(im))) * 0.0d0
else if (re <= 1.2d+79) then
tmp = sqrt(((abs(im) + re) * 2.0d0)) * 0.5d0
else
tmp = 0.5d0 * sqrt((4.0d0 * re))
end if
code = tmp
end function
public static double code(double re, double im) {
double tmp;
if (re <= -4.2e+222) {
tmp = Math.sqrt((Math.abs(im) + Math.abs(im))) * 0.0;
} else if (re <= 1.2e+79) {
tmp = Math.sqrt(((Math.abs(im) + re) * 2.0)) * 0.5;
} else {
tmp = 0.5 * Math.sqrt((4.0 * re));
}
return tmp;
}
def code(re, im): tmp = 0 if re <= -4.2e+222: tmp = math.sqrt((math.fabs(im) + math.fabs(im))) * 0.0 elif re <= 1.2e+79: tmp = math.sqrt(((math.fabs(im) + re) * 2.0)) * 0.5 else: tmp = 0.5 * math.sqrt((4.0 * re)) return tmp
function code(re, im) tmp = 0.0 if (re <= -4.2e+222) tmp = Float64(sqrt(Float64(abs(im) + abs(im))) * 0.0); elseif (re <= 1.2e+79) tmp = Float64(sqrt(Float64(Float64(abs(im) + re) * 2.0)) * 0.5); else tmp = Float64(0.5 * sqrt(Float64(4.0 * re))); end return tmp end
function tmp_2 = code(re, im) tmp = 0.0; if (re <= -4.2e+222) tmp = sqrt((abs(im) + abs(im))) * 0.0; elseif (re <= 1.2e+79) tmp = sqrt(((abs(im) + re) * 2.0)) * 0.5; else tmp = 0.5 * sqrt((4.0 * re)); end tmp_2 = tmp; end
code[re_, im_] := If[LessEqual[re, -4.2e+222], N[(N[Sqrt[N[(N[Abs[im], $MachinePrecision] + N[Abs[im], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * 0.0), $MachinePrecision], If[LessEqual[re, 1.2e+79], N[(N[Sqrt[N[(N[(N[Abs[im], $MachinePrecision] + re), $MachinePrecision] * 2.0), $MachinePrecision]], $MachinePrecision] * 0.5), $MachinePrecision], N[(0.5 * N[Sqrt[N[(4.0 * re), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\mathbf{if}\;re \leq -4.2 \cdot 10^{+222}:\\
\;\;\;\;\sqrt{\left|im\right| + \left|im\right|} \cdot 0\\
\mathbf{elif}\;re \leq 1.2 \cdot 10^{+79}:\\
\;\;\;\;\sqrt{\left(\left|im\right| + re\right) \cdot 2} \cdot 0.5\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{4 \cdot re}\\
\end{array}
if re < -4.2000000000000002e222Initial program 41.2%
Taylor expanded in im around -inf
lower-*.f6425.9%
Applied rewrites25.9%
Taylor expanded in im around inf
lower-*.f6426.9%
Applied rewrites26.9%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6426.9%
lift-*.f64N/A
count-2-revN/A
lower-+.f6426.9%
Applied rewrites26.9%
Taylor expanded in undef-var around zero
Applied rewrites2.8%
if -4.2000000000000002e222 < re < 1.1999999999999999e79Initial program 41.2%
Taylor expanded in im around inf
lower-*.f64N/A
lower-+.f64N/A
lower-/.f6429.5%
Applied rewrites29.5%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6429.5%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6429.5%
lift-*.f64N/A
*-commutativeN/A
lift-+.f64N/A
lift-/.f64N/A
sum-to-mult-revN/A
lower-+.f6430.6%
Applied rewrites30.6%
if 1.1999999999999999e79 < re Initial program 41.2%
Taylor expanded in im around -inf
lower-*.f6425.9%
Applied rewrites25.9%
Taylor expanded in im around inf
lower-*.f6426.9%
Applied rewrites26.9%
Taylor expanded in re around inf
lower-*.f6426.3%
Applied rewrites26.3%
(FPCore (re im) :precision binary64 (if (<= (fabs im) 6.8e-68) (* 0.5 (sqrt (* 4.0 re))) (* (* 0.5 (sqrt 2.0)) (sqrt (fabs (+ (- (fabs im)) re))))))
double code(double re, double im) {
double tmp;
if (fabs(im) <= 6.8e-68) {
tmp = 0.5 * sqrt((4.0 * re));
} else {
tmp = (0.5 * sqrt(2.0)) * sqrt(fabs((-fabs(im) + re)));
}
return tmp;
}
real(8) function code(re, im)
use fmin_fmax_functions
real(8), intent (in) :: re
real(8), intent (in) :: im
real(8) :: tmp
if (abs(im) <= 6.8d-68) then
tmp = 0.5d0 * sqrt((4.0d0 * re))
else
tmp = (0.5d0 * sqrt(2.0d0)) * sqrt(abs((-abs(im) + re)))
end if
code = tmp
end function
public static double code(double re, double im) {
double tmp;
if (Math.abs(im) <= 6.8e-68) {
tmp = 0.5 * Math.sqrt((4.0 * re));
} else {
tmp = (0.5 * Math.sqrt(2.0)) * Math.sqrt(Math.abs((-Math.abs(im) + re)));
}
return tmp;
}
def code(re, im): tmp = 0 if math.fabs(im) <= 6.8e-68: tmp = 0.5 * math.sqrt((4.0 * re)) else: tmp = (0.5 * math.sqrt(2.0)) * math.sqrt(math.fabs((-math.fabs(im) + re))) return tmp
function code(re, im) tmp = 0.0 if (abs(im) <= 6.8e-68) tmp = Float64(0.5 * sqrt(Float64(4.0 * re))); else tmp = Float64(Float64(0.5 * sqrt(2.0)) * sqrt(abs(Float64(Float64(-abs(im)) + re)))); end return tmp end
function tmp_2 = code(re, im) tmp = 0.0; if (abs(im) <= 6.8e-68) tmp = 0.5 * sqrt((4.0 * re)); else tmp = (0.5 * sqrt(2.0)) * sqrt(abs((-abs(im) + re))); end tmp_2 = tmp; end
code[re_, im_] := If[LessEqual[N[Abs[im], $MachinePrecision], 6.8e-68], N[(0.5 * N[Sqrt[N[(4.0 * re), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[(N[(0.5 * N[Sqrt[2.0], $MachinePrecision]), $MachinePrecision] * N[Sqrt[N[Abs[N[((-N[Abs[im], $MachinePrecision]) + re), $MachinePrecision]], $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\mathbf{if}\;\left|im\right| \leq 6.8 \cdot 10^{-68}:\\
\;\;\;\;0.5 \cdot \sqrt{4 \cdot re}\\
\mathbf{else}:\\
\;\;\;\;\left(0.5 \cdot \sqrt{2}\right) \cdot \sqrt{\left|\left(-\left|im\right|\right) + re\right|}\\
\end{array}
if im < 6.8000000000000004e-68Initial program 41.2%
Taylor expanded in im around -inf
lower-*.f6425.9%
Applied rewrites25.9%
Taylor expanded in im around inf
lower-*.f6426.9%
Applied rewrites26.9%
Taylor expanded in re around inf
lower-*.f6426.3%
Applied rewrites26.3%
if 6.8000000000000004e-68 < im Initial program 41.2%
Taylor expanded in im around -inf
lower-*.f6429.5%
Applied rewrites29.5%
lift-*.f64N/A
lift-sqrt.f64N/A
lift-*.f64N/A
sqrt-prodN/A
associate-*r*N/A
lower-*.f64N/A
lower-*.f64N/A
metadata-evalN/A
lower-sqrt.f64N/A
lower-sqrt.f64N/A
lower-fabs.f6455.7%
Applied rewrites55.7%
(FPCore (re im) :precision binary64 (if (<= (fabs im) 2e-64) (* 0.5 (sqrt (* 4.0 re))) (* (sqrt (+ (fabs im) (fabs im))) 0.5)))
double code(double re, double im) {
double tmp;
if (fabs(im) <= 2e-64) {
tmp = 0.5 * sqrt((4.0 * re));
} else {
tmp = sqrt((fabs(im) + fabs(im))) * 0.5;
}
return tmp;
}
real(8) function code(re, im)
use fmin_fmax_functions
real(8), intent (in) :: re
real(8), intent (in) :: im
real(8) :: tmp
if (abs(im) <= 2d-64) then
tmp = 0.5d0 * sqrt((4.0d0 * re))
else
tmp = sqrt((abs(im) + abs(im))) * 0.5d0
end if
code = tmp
end function
public static double code(double re, double im) {
double tmp;
if (Math.abs(im) <= 2e-64) {
tmp = 0.5 * Math.sqrt((4.0 * re));
} else {
tmp = Math.sqrt((Math.abs(im) + Math.abs(im))) * 0.5;
}
return tmp;
}
def code(re, im): tmp = 0 if math.fabs(im) <= 2e-64: tmp = 0.5 * math.sqrt((4.0 * re)) else: tmp = math.sqrt((math.fabs(im) + math.fabs(im))) * 0.5 return tmp
function code(re, im) tmp = 0.0 if (abs(im) <= 2e-64) tmp = Float64(0.5 * sqrt(Float64(4.0 * re))); else tmp = Float64(sqrt(Float64(abs(im) + abs(im))) * 0.5); end return tmp end
function tmp_2 = code(re, im) tmp = 0.0; if (abs(im) <= 2e-64) tmp = 0.5 * sqrt((4.0 * re)); else tmp = sqrt((abs(im) + abs(im))) * 0.5; end tmp_2 = tmp; end
code[re_, im_] := If[LessEqual[N[Abs[im], $MachinePrecision], 2e-64], N[(0.5 * N[Sqrt[N[(4.0 * re), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[(N[Sqrt[N[(N[Abs[im], $MachinePrecision] + N[Abs[im], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * 0.5), $MachinePrecision]]
\begin{array}{l}
\mathbf{if}\;\left|im\right| \leq 2 \cdot 10^{-64}:\\
\;\;\;\;0.5 \cdot \sqrt{4 \cdot re}\\
\mathbf{else}:\\
\;\;\;\;\sqrt{\left|im\right| + \left|im\right|} \cdot 0.5\\
\end{array}
if im < 1.9999999999999999e-64Initial program 41.2%
Taylor expanded in im around -inf
lower-*.f6425.9%
Applied rewrites25.9%
Taylor expanded in im around inf
lower-*.f6426.9%
Applied rewrites26.9%
Taylor expanded in re around inf
lower-*.f6426.3%
Applied rewrites26.3%
if 1.9999999999999999e-64 < im Initial program 41.2%
Taylor expanded in im around -inf
lower-*.f6425.9%
Applied rewrites25.9%
Taylor expanded in im around inf
lower-*.f6426.9%
Applied rewrites26.9%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6426.9%
lift-*.f64N/A
count-2-revN/A
lower-+.f6426.9%
Applied rewrites26.9%
(FPCore (re im) :precision binary64 (let* ((t_0 (sqrt (+ (fabs im) (fabs im))))) (if (<= (fabs im) 1.02e-222) (* t_0 0.0) (* t_0 0.5))))
double code(double re, double im) {
double t_0 = sqrt((fabs(im) + fabs(im)));
double tmp;
if (fabs(im) <= 1.02e-222) {
tmp = t_0 * 0.0;
} else {
tmp = t_0 * 0.5;
}
return tmp;
}
real(8) function code(re, im)
use fmin_fmax_functions
real(8), intent (in) :: re
real(8), intent (in) :: im
real(8) :: t_0
real(8) :: tmp
t_0 = sqrt((abs(im) + abs(im)))
if (abs(im) <= 1.02d-222) then
tmp = t_0 * 0.0d0
else
tmp = t_0 * 0.5d0
end if
code = tmp
end function
public static double code(double re, double im) {
double t_0 = Math.sqrt((Math.abs(im) + Math.abs(im)));
double tmp;
if (Math.abs(im) <= 1.02e-222) {
tmp = t_0 * 0.0;
} else {
tmp = t_0 * 0.5;
}
return tmp;
}
def code(re, im): t_0 = math.sqrt((math.fabs(im) + math.fabs(im))) tmp = 0 if math.fabs(im) <= 1.02e-222: tmp = t_0 * 0.0 else: tmp = t_0 * 0.5 return tmp
function code(re, im) t_0 = sqrt(Float64(abs(im) + abs(im))) tmp = 0.0 if (abs(im) <= 1.02e-222) tmp = Float64(t_0 * 0.0); else tmp = Float64(t_0 * 0.5); end return tmp end
function tmp_2 = code(re, im) t_0 = sqrt((abs(im) + abs(im))); tmp = 0.0; if (abs(im) <= 1.02e-222) tmp = t_0 * 0.0; else tmp = t_0 * 0.5; end tmp_2 = tmp; end
code[re_, im_] := Block[{t$95$0 = N[Sqrt[N[(N[Abs[im], $MachinePrecision] + N[Abs[im], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]}, If[LessEqual[N[Abs[im], $MachinePrecision], 1.02e-222], N[(t$95$0 * 0.0), $MachinePrecision], N[(t$95$0 * 0.5), $MachinePrecision]]]
\begin{array}{l}
t_0 := \sqrt{\left|im\right| + \left|im\right|}\\
\mathbf{if}\;\left|im\right| \leq 1.02 \cdot 10^{-222}:\\
\;\;\;\;t\_0 \cdot 0\\
\mathbf{else}:\\
\;\;\;\;t\_0 \cdot 0.5\\
\end{array}
if im < 1.0199999999999999e-222Initial program 41.2%
Taylor expanded in im around -inf
lower-*.f6425.9%
Applied rewrites25.9%
Taylor expanded in im around inf
lower-*.f6426.9%
Applied rewrites26.9%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6426.9%
lift-*.f64N/A
count-2-revN/A
lower-+.f6426.9%
Applied rewrites26.9%
Taylor expanded in undef-var around zero
Applied rewrites2.8%
if 1.0199999999999999e-222 < im Initial program 41.2%
Taylor expanded in im around -inf
lower-*.f6425.9%
Applied rewrites25.9%
Taylor expanded in im around inf
lower-*.f6426.9%
Applied rewrites26.9%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6426.9%
lift-*.f64N/A
count-2-revN/A
lower-+.f6426.9%
Applied rewrites26.9%
(FPCore (re im) :precision binary64 (* (sqrt (+ (fabs im) (fabs im))) 0.5))
double code(double re, double im) {
return sqrt((fabs(im) + fabs(im))) * 0.5;
}
real(8) function code(re, im)
use fmin_fmax_functions
real(8), intent (in) :: re
real(8), intent (in) :: im
code = sqrt((abs(im) + abs(im))) * 0.5d0
end function
public static double code(double re, double im) {
return Math.sqrt((Math.abs(im) + Math.abs(im))) * 0.5;
}
def code(re, im): return math.sqrt((math.fabs(im) + math.fabs(im))) * 0.5
function code(re, im) return Float64(sqrt(Float64(abs(im) + abs(im))) * 0.5) end
function tmp = code(re, im) tmp = sqrt((abs(im) + abs(im))) * 0.5; end
code[re_, im_] := N[(N[Sqrt[N[(N[Abs[im], $MachinePrecision] + N[Abs[im], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * 0.5), $MachinePrecision]
\sqrt{\left|im\right| + \left|im\right|} \cdot 0.5
Initial program 41.2%
Taylor expanded in im around -inf
lower-*.f6425.9%
Applied rewrites25.9%
Taylor expanded in im around inf
lower-*.f6426.9%
Applied rewrites26.9%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6426.9%
lift-*.f64N/A
count-2-revN/A
lower-+.f6426.9%
Applied rewrites26.9%
(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)
use fmin_fmax_functions
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}
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}
herbie shell --seed 2025313 -o setup:search
(FPCore (re im)
:name "math.sqrt on complex, real part"
:precision binary64
:alt
(! :herbie-platform c (if (< re 0) (* 1/2 (* (sqrt 2) (sqrt (/ (* im im) (- (modulus re im) re))))) (* 1/2 (sqrt (* 2 (+ (modulus re im) re))))))
(* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))