| Alternative 1 | |
|---|---|
| Error | 26.6 |
| Cost | 14028 |
(FPCore (re im) :precision binary64 (* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))
(FPCore (re im)
:precision binary64
(let* ((t_0 (* im (sqrt (/ -1.0 re))))
(t_1 (* 0.5 t_0))
(t_2 (* 0.5 (sqrt (* 2.0 (+ (- im) re))))))
(if (<= re -2.35e+136)
t_1
(if (<= re -4.4e-15)
(/ t_0 -2.0)
(if (<= re -1.08e-97)
t_1
(if (<= re -8.6e-276)
(* 0.5 (sqrt (* im 2.0)))
(if (<= re 1e-224)
t_2
(if (<= re 2e-166)
(* 0.5 (sqrt (* 2.0 (+ re im))))
(if (<= re 6.2e-102) t_2 (* 0.5 (* 2.0 (sqrt re))))))))))))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 = im * sqrt((-1.0 / re));
double t_1 = 0.5 * t_0;
double t_2 = 0.5 * sqrt((2.0 * (-im + re)));
double tmp;
if (re <= -2.35e+136) {
tmp = t_1;
} else if (re <= -4.4e-15) {
tmp = t_0 / -2.0;
} else if (re <= -1.08e-97) {
tmp = t_1;
} else if (re <= -8.6e-276) {
tmp = 0.5 * sqrt((im * 2.0));
} else if (re <= 1e-224) {
tmp = t_2;
} else if (re <= 2e-166) {
tmp = 0.5 * sqrt((2.0 * (re + im)));
} else if (re <= 6.2e-102) {
tmp = t_2;
} else {
tmp = 0.5 * (2.0 * sqrt(re));
}
return tmp;
}
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
real(8) function code(re, im)
real(8), intent (in) :: re
real(8), intent (in) :: im
real(8) :: t_0
real(8) :: t_1
real(8) :: t_2
real(8) :: tmp
t_0 = im * sqrt(((-1.0d0) / re))
t_1 = 0.5d0 * t_0
t_2 = 0.5d0 * sqrt((2.0d0 * (-im + re)))
if (re <= (-2.35d+136)) then
tmp = t_1
else if (re <= (-4.4d-15)) then
tmp = t_0 / (-2.0d0)
else if (re <= (-1.08d-97)) then
tmp = t_1
else if (re <= (-8.6d-276)) then
tmp = 0.5d0 * sqrt((im * 2.0d0))
else if (re <= 1d-224) then
tmp = t_2
else if (re <= 2d-166) then
tmp = 0.5d0 * sqrt((2.0d0 * (re + im)))
else if (re <= 6.2d-102) then
tmp = t_2
else
tmp = 0.5d0 * (2.0d0 * sqrt(re))
end if
code = tmp
end function
public static double code(double re, double im) {
return 0.5 * Math.sqrt((2.0 * (Math.sqrt(((re * re) + (im * im))) + re)));
}
public static double code(double re, double im) {
double t_0 = im * Math.sqrt((-1.0 / re));
double t_1 = 0.5 * t_0;
double t_2 = 0.5 * Math.sqrt((2.0 * (-im + re)));
double tmp;
if (re <= -2.35e+136) {
tmp = t_1;
} else if (re <= -4.4e-15) {
tmp = t_0 / -2.0;
} else if (re <= -1.08e-97) {
tmp = t_1;
} else if (re <= -8.6e-276) {
tmp = 0.5 * Math.sqrt((im * 2.0));
} else if (re <= 1e-224) {
tmp = t_2;
} else if (re <= 2e-166) {
tmp = 0.5 * Math.sqrt((2.0 * (re + im)));
} else if (re <= 6.2e-102) {
tmp = t_2;
} else {
tmp = 0.5 * (2.0 * Math.sqrt(re));
}
return tmp;
}
def code(re, im): return 0.5 * math.sqrt((2.0 * (math.sqrt(((re * re) + (im * im))) + re)))
def code(re, im): t_0 = im * math.sqrt((-1.0 / re)) t_1 = 0.5 * t_0 t_2 = 0.5 * math.sqrt((2.0 * (-im + re))) tmp = 0 if re <= -2.35e+136: tmp = t_1 elif re <= -4.4e-15: tmp = t_0 / -2.0 elif re <= -1.08e-97: tmp = t_1 elif re <= -8.6e-276: tmp = 0.5 * math.sqrt((im * 2.0)) elif re <= 1e-224: tmp = t_2 elif re <= 2e-166: tmp = 0.5 * math.sqrt((2.0 * (re + im))) elif re <= 6.2e-102: tmp = t_2 else: tmp = 0.5 * (2.0 * math.sqrt(re)) 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(im * sqrt(Float64(-1.0 / re))) t_1 = Float64(0.5 * t_0) t_2 = Float64(0.5 * sqrt(Float64(2.0 * Float64(Float64(-im) + re)))) tmp = 0.0 if (re <= -2.35e+136) tmp = t_1; elseif (re <= -4.4e-15) tmp = Float64(t_0 / -2.0); elseif (re <= -1.08e-97) tmp = t_1; elseif (re <= -8.6e-276) tmp = Float64(0.5 * sqrt(Float64(im * 2.0))); elseif (re <= 1e-224) tmp = t_2; elseif (re <= 2e-166) tmp = Float64(0.5 * sqrt(Float64(2.0 * Float64(re + im)))); elseif (re <= 6.2e-102) tmp = t_2; else tmp = Float64(0.5 * Float64(2.0 * sqrt(re))); end return tmp end
function tmp = code(re, im) tmp = 0.5 * sqrt((2.0 * (sqrt(((re * re) + (im * im))) + re))); end
function tmp_2 = code(re, im) t_0 = im * sqrt((-1.0 / re)); t_1 = 0.5 * t_0; t_2 = 0.5 * sqrt((2.0 * (-im + re))); tmp = 0.0; if (re <= -2.35e+136) tmp = t_1; elseif (re <= -4.4e-15) tmp = t_0 / -2.0; elseif (re <= -1.08e-97) tmp = t_1; elseif (re <= -8.6e-276) tmp = 0.5 * sqrt((im * 2.0)); elseif (re <= 1e-224) tmp = t_2; elseif (re <= 2e-166) tmp = 0.5 * sqrt((2.0 * (re + im))); elseif (re <= 6.2e-102) tmp = t_2; else tmp = 0.5 * (2.0 * sqrt(re)); end tmp_2 = 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[(im * N[Sqrt[N[(-1.0 / re), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]}, Block[{t$95$1 = N[(0.5 * t$95$0), $MachinePrecision]}, Block[{t$95$2 = N[(0.5 * N[Sqrt[N[(2.0 * N[((-im) + re), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]}, If[LessEqual[re, -2.35e+136], t$95$1, If[LessEqual[re, -4.4e-15], N[(t$95$0 / -2.0), $MachinePrecision], If[LessEqual[re, -1.08e-97], t$95$1, If[LessEqual[re, -8.6e-276], N[(0.5 * N[Sqrt[N[(im * 2.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], If[LessEqual[re, 1e-224], t$95$2, If[LessEqual[re, 2e-166], N[(0.5 * N[Sqrt[N[(2.0 * N[(re + im), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], If[LessEqual[re, 6.2e-102], t$95$2, N[(0.5 * N[(2.0 * N[Sqrt[re], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]]]]]]]]]
0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
\begin{array}{l}
t_0 := im \cdot \sqrt{\frac{-1}{re}}\\
t_1 := 0.5 \cdot t_0\\
t_2 := 0.5 \cdot \sqrt{2 \cdot \left(\left(-im\right) + re\right)}\\
\mathbf{if}\;re \leq -2.35 \cdot 10^{+136}:\\
\;\;\;\;t_1\\
\mathbf{elif}\;re \leq -4.4 \cdot 10^{-15}:\\
\;\;\;\;\frac{t_0}{-2}\\
\mathbf{elif}\;re \leq -1.08 \cdot 10^{-97}:\\
\;\;\;\;t_1\\
\mathbf{elif}\;re \leq -8.6 \cdot 10^{-276}:\\
\;\;\;\;0.5 \cdot \sqrt{im \cdot 2}\\
\mathbf{elif}\;re \leq 10^{-224}:\\
\;\;\;\;t_2\\
\mathbf{elif}\;re \leq 2 \cdot 10^{-166}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\right)}\\
\mathbf{elif}\;re \leq 6.2 \cdot 10^{-102}:\\
\;\;\;\;t_2\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \left(2 \cdot \sqrt{re}\right)\\
\end{array}
Results
| Original | 38.6 |
|---|---|
| Target | 33.3 |
| Herbie | 31.7 |
if re < -2.35000000000000002e136 or -4.39999999999999971e-15 < re < -1.0799999999999999e-97Initial program 55.6
Taylor expanded in re around -inf 38.3
Simplified38.3
[Start]38.3 | \[ 0.5 \cdot \sqrt{2 \cdot \left(-0.5 \cdot \frac{{im}^{2}}{re}\right)}
\] |
|---|---|
rational.json-simplify-2 [=>]38.3 | \[ 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(\frac{{im}^{2}}{re} \cdot -0.5\right)}}
\] |
Taylor expanded in im around 0 64.0
Simplified36.3
[Start]64.0 | \[ 0.5 \cdot \left(\left(\sqrt{-1} \cdot im\right) \cdot \sqrt{\frac{1}{re}}\right)
\] |
|---|---|
rational.json-simplify-2 [=>]64.0 | \[ 0.5 \cdot \color{blue}{\left(\sqrt{\frac{1}{re}} \cdot \left(\sqrt{-1} \cdot im\right)\right)}
\] |
rational.json-simplify-2 [=>]64.0 | \[ 0.5 \cdot \left(\sqrt{\frac{1}{re}} \cdot \color{blue}{\left(im \cdot \sqrt{-1}\right)}\right)
\] |
rational.json-simplify-43 [=>]64.0 | \[ 0.5 \cdot \color{blue}{\left(im \cdot \left(\sqrt{-1} \cdot \sqrt{\frac{1}{re}}\right)\right)}
\] |
exponential.json-simplify-20 [=>]36.3 | \[ 0.5 \cdot \left(im \cdot \color{blue}{\sqrt{\frac{1}{re} \cdot -1}}\right)
\] |
rational.json-simplify-8 [<=]36.3 | \[ 0.5 \cdot \left(im \cdot \sqrt{\color{blue}{-\frac{1}{re}}}\right)
\] |
rational.json-simplify-10 [=>]36.3 | \[ 0.5 \cdot \left(im \cdot \sqrt{\color{blue}{\frac{\frac{1}{re}}{-1}}}\right)
\] |
rational.json-simplify-35 [=>]36.3 | \[ 0.5 \cdot \left(im \cdot \sqrt{\frac{\color{blue}{\frac{1 + 1}{re + re}}}{-1}}\right)
\] |
metadata-eval [=>]36.3 | \[ 0.5 \cdot \left(im \cdot \sqrt{\frac{\frac{\color{blue}{2}}{re + re}}{-1}}\right)
\] |
rational.json-simplify-46 [<=]36.3 | \[ 0.5 \cdot \left(im \cdot \sqrt{\color{blue}{\frac{2}{\left(re + re\right) \cdot -1}}}\right)
\] |
rational.json-simplify-8 [<=]36.3 | \[ 0.5 \cdot \left(im \cdot \sqrt{\frac{2}{\color{blue}{-\left(re + re\right)}}}\right)
\] |
rational.json-simplify-10 [=>]36.3 | \[ 0.5 \cdot \left(im \cdot \sqrt{\frac{2}{\color{blue}{\frac{re + re}{-1}}}}\right)
\] |
rational.json-simplify-61 [=>]36.3 | \[ 0.5 \cdot \left(im \cdot \sqrt{\color{blue}{\frac{-1}{\frac{re + re}{2}}}}\right)
\] |
metadata-eval [<=]36.3 | \[ 0.5 \cdot \left(im \cdot \sqrt{\frac{-1}{\frac{re + re}{\color{blue}{1 + 1}}}}\right)
\] |
rational.json-simplify-35 [<=]36.3 | \[ 0.5 \cdot \left(im \cdot \sqrt{\frac{-1}{\color{blue}{\frac{re}{1}}}}\right)
\] |
rational.json-simplify-7 [=>]36.3 | \[ 0.5 \cdot \left(im \cdot \sqrt{\frac{-1}{\color{blue}{re}}}\right)
\] |
if -2.35000000000000002e136 < re < -4.39999999999999971e-15Initial program 48.6
Taylor expanded in re around -inf 39.2
Simplified39.2
[Start]39.2 | \[ 0.5 \cdot \sqrt{2 \cdot \left(-0.5 \cdot \frac{{im}^{2}}{re}\right)}
\] |
|---|---|
rational.json-simplify-2 [=>]39.2 | \[ 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(\frac{{im}^{2}}{re} \cdot -0.5\right)}}
\] |
Taylor expanded in im around -inf 64.0
Simplified41.1
[Start]64.0 | \[ 0.5 \cdot \left(-1 \cdot \left(\left(\sqrt{-1} \cdot im\right) \cdot \sqrt{\frac{1}{re}}\right)\right)
\] |
|---|---|
rational.json-simplify-2 [=>]64.0 | \[ 0.5 \cdot \color{blue}{\left(\left(\left(\sqrt{-1} \cdot im\right) \cdot \sqrt{\frac{1}{re}}\right) \cdot -1\right)}
\] |
rational.json-simplify-9 [=>]64.0 | \[ 0.5 \cdot \color{blue}{\left(-\left(\sqrt{-1} \cdot im\right) \cdot \sqrt{\frac{1}{re}}\right)}
\] |
rational.json-simplify-2 [=>]64.0 | \[ 0.5 \cdot \left(-\color{blue}{\sqrt{\frac{1}{re}} \cdot \left(\sqrt{-1} \cdot im\right)}\right)
\] |
rational.json-simplify-2 [=>]64.0 | \[ 0.5 \cdot \left(-\sqrt{\frac{1}{re}} \cdot \color{blue}{\left(im \cdot \sqrt{-1}\right)}\right)
\] |
rational.json-simplify-43 [=>]64.0 | \[ 0.5 \cdot \left(-\color{blue}{im \cdot \left(\sqrt{-1} \cdot \sqrt{\frac{1}{re}}\right)}\right)
\] |
exponential.json-simplify-20 [=>]41.1 | \[ 0.5 \cdot \left(-im \cdot \color{blue}{\sqrt{\frac{1}{re} \cdot -1}}\right)
\] |
rational.json-simplify-8 [<=]41.1 | \[ 0.5 \cdot \left(-im \cdot \sqrt{\color{blue}{-\frac{1}{re}}}\right)
\] |
rational.json-simplify-10 [=>]41.1 | \[ 0.5 \cdot \left(-im \cdot \sqrt{\color{blue}{\frac{\frac{1}{re}}{-1}}}\right)
\] |
rational.json-simplify-35 [=>]41.1 | \[ 0.5 \cdot \left(-im \cdot \sqrt{\frac{\color{blue}{\frac{1 + 1}{re + re}}}{-1}}\right)
\] |
metadata-eval [=>]41.1 | \[ 0.5 \cdot \left(-im \cdot \sqrt{\frac{\frac{\color{blue}{2}}{re + re}}{-1}}\right)
\] |
rational.json-simplify-46 [<=]41.1 | \[ 0.5 \cdot \left(-im \cdot \sqrt{\color{blue}{\frac{2}{\left(re + re\right) \cdot -1}}}\right)
\] |
rational.json-simplify-8 [<=]41.1 | \[ 0.5 \cdot \left(-im \cdot \sqrt{\frac{2}{\color{blue}{-\left(re + re\right)}}}\right)
\] |
rational.json-simplify-10 [=>]41.1 | \[ 0.5 \cdot \left(-im \cdot \sqrt{\frac{2}{\color{blue}{\frac{re + re}{-1}}}}\right)
\] |
rational.json-simplify-61 [=>]41.1 | \[ 0.5 \cdot \left(-im \cdot \sqrt{\color{blue}{\frac{-1}{\frac{re + re}{2}}}}\right)
\] |
metadata-eval [<=]41.1 | \[ 0.5 \cdot \left(-im \cdot \sqrt{\frac{-1}{\frac{re + re}{\color{blue}{1 + 1}}}}\right)
\] |
rational.json-simplify-35 [<=]41.1 | \[ 0.5 \cdot \left(-im \cdot \sqrt{\frac{-1}{\color{blue}{\frac{re}{1}}}}\right)
\] |
rational.json-simplify-7 [=>]41.1 | \[ 0.5 \cdot \left(-im \cdot \sqrt{\frac{-1}{\color{blue}{re}}}\right)
\] |
Applied egg-rr41.1
if -1.0799999999999999e-97 < re < -8.59999999999999921e-276Initial program 31.7
Taylor expanded in re around 0 38.8
Simplified38.6
[Start]38.8 | \[ 0.5 \cdot \left(\sqrt{2} \cdot \sqrt{im}\right)
\] |
|---|---|
exponential.json-simplify-20 [=>]38.6 | \[ 0.5 \cdot \color{blue}{\sqrt{im \cdot 2}}
\] |
if -8.59999999999999921e-276 < re < 1e-224 or 2.00000000000000008e-166 < re < 6.20000000000000026e-102Initial program 23.8
Taylor expanded in im around -inf 35.3
Simplified35.3
[Start]35.3 | \[ 0.5 \cdot \sqrt{2 \cdot \left(-1 \cdot im + re\right)}
\] |
|---|---|
rational.json-simplify-2 [=>]35.3 | \[ 0.5 \cdot \sqrt{2 \cdot \left(\color{blue}{im \cdot -1} + re\right)}
\] |
rational.json-simplify-9 [=>]35.3 | \[ 0.5 \cdot \sqrt{2 \cdot \left(\color{blue}{\left(-im\right)} + re\right)}
\] |
if 1e-224 < re < 2.00000000000000008e-166Initial program 28.3
Taylor expanded in re around 0 36.3
if 6.20000000000000026e-102 < re Initial program 34.9
Taylor expanded in im around 0 21.2
Simplified20.3
[Start]21.2 | \[ 0.5 \cdot \left({\left(\sqrt{2}\right)}^{2} \cdot \sqrt{re}\right)
\] |
|---|---|
exponential.json-simplify-24 [=>]20.3 | \[ 0.5 \cdot \left(\color{blue}{\sqrt{{2}^{2}}} \cdot \sqrt{re}\right)
\] |
metadata-eval [=>]20.3 | \[ 0.5 \cdot \left(\sqrt{\color{blue}{4}} \cdot \sqrt{re}\right)
\] |
metadata-eval [=>]20.3 | \[ 0.5 \cdot \left(\color{blue}{2} \cdot \sqrt{re}\right)
\] |
Final simplification31.7
| Alternative 1 | |
|---|---|
| Error | 26.6 |
| Cost | 14028 |
| Alternative 2 | |
|---|---|
| Error | 31.8 |
| Cost | 7376 |
| Alternative 3 | |
|---|---|
| Error | 31.7 |
| Cost | 7112 |
| Alternative 4 | |
|---|---|
| Error | 31.9 |
| Cost | 7112 |
| Alternative 5 | |
|---|---|
| Error | 36.3 |
| Cost | 6980 |
| Alternative 6 | |
|---|---|
| Error | 37.0 |
| Cost | 6852 |
| Alternative 7 | |
|---|---|
| Error | 47.4 |
| Cost | 6720 |
herbie shell --seed 2023075
(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)))))