| Alternative 1 | |
|---|---|
| Error | 17.42% |
| Cost | 20100 |
(FPCore (re im) :precision binary64 (* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))
(FPCore (re im)
:precision binary64
(if (<= re -1.6e+235)
(* 0.5 (sqrt (/ (- im) (/ re im))))
(if (<= re -1.26e+132)
(*
0.5
(* (/ (sqrt (* im -0.5)) (/ (sqrt (- re)) (sqrt (- im)))) (sqrt 2.0)))
(if (<= re -3.7e+50)
(*
0.5
(sqrt
(*
2.0
(+ (* 0.125 (* im (pow (/ im re) 3.0))) (* -0.5 (* im (/ im re)))))))
(* 0.5 (* (sqrt 2.0) (sqrt (/ 1.0 (/ 1.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 tmp;
if (re <= -1.6e+235) {
tmp = 0.5 * sqrt((-im / (re / im)));
} else if (re <= -1.26e+132) {
tmp = 0.5 * ((sqrt((im * -0.5)) / (sqrt(-re) / sqrt(-im))) * sqrt(2.0));
} else if (re <= -3.7e+50) {
tmp = 0.5 * sqrt((2.0 * ((0.125 * (im * pow((im / re), 3.0))) + (-0.5 * (im * (im / re))))));
} else {
tmp = 0.5 * (sqrt(2.0) * sqrt((1.0 / (1.0 / (re + hypot(re, im))))));
}
return tmp;
}
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 tmp;
if (re <= -1.6e+235) {
tmp = 0.5 * Math.sqrt((-im / (re / im)));
} else if (re <= -1.26e+132) {
tmp = 0.5 * ((Math.sqrt((im * -0.5)) / (Math.sqrt(-re) / Math.sqrt(-im))) * Math.sqrt(2.0));
} else if (re <= -3.7e+50) {
tmp = 0.5 * Math.sqrt((2.0 * ((0.125 * (im * Math.pow((im / re), 3.0))) + (-0.5 * (im * (im / re))))));
} else {
tmp = 0.5 * (Math.sqrt(2.0) * Math.sqrt((1.0 / (1.0 / (re + Math.hypot(re, im))))));
}
return tmp;
}
def code(re, im): return 0.5 * math.sqrt((2.0 * (math.sqrt(((re * re) + (im * im))) + re)))
def code(re, im): tmp = 0 if re <= -1.6e+235: tmp = 0.5 * math.sqrt((-im / (re / im))) elif re <= -1.26e+132: tmp = 0.5 * ((math.sqrt((im * -0.5)) / (math.sqrt(-re) / math.sqrt(-im))) * math.sqrt(2.0)) elif re <= -3.7e+50: tmp = 0.5 * math.sqrt((2.0 * ((0.125 * (im * math.pow((im / re), 3.0))) + (-0.5 * (im * (im / re)))))) else: tmp = 0.5 * (math.sqrt(2.0) * math.sqrt((1.0 / (1.0 / (re + math.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) tmp = 0.0 if (re <= -1.6e+235) tmp = Float64(0.5 * sqrt(Float64(Float64(-im) / Float64(re / im)))); elseif (re <= -1.26e+132) tmp = Float64(0.5 * Float64(Float64(sqrt(Float64(im * -0.5)) / Float64(sqrt(Float64(-re)) / sqrt(Float64(-im)))) * sqrt(2.0))); elseif (re <= -3.7e+50) tmp = Float64(0.5 * sqrt(Float64(2.0 * Float64(Float64(0.125 * Float64(im * (Float64(im / re) ^ 3.0))) + Float64(-0.5 * Float64(im * Float64(im / re))))))); else tmp = Float64(0.5 * Float64(sqrt(2.0) * sqrt(Float64(1.0 / Float64(1.0 / Float64(re + hypot(re, im))))))); 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) tmp = 0.0; if (re <= -1.6e+235) tmp = 0.5 * sqrt((-im / (re / im))); elseif (re <= -1.26e+132) tmp = 0.5 * ((sqrt((im * -0.5)) / (sqrt(-re) / sqrt(-im))) * sqrt(2.0)); elseif (re <= -3.7e+50) tmp = 0.5 * sqrt((2.0 * ((0.125 * (im * ((im / re) ^ 3.0))) + (-0.5 * (im * (im / re)))))); else tmp = 0.5 * (sqrt(2.0) * sqrt((1.0 / (1.0 / (re + hypot(re, im)))))); 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_] := If[LessEqual[re, -1.6e+235], N[(0.5 * N[Sqrt[N[((-im) / N[(re / im), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], If[LessEqual[re, -1.26e+132], N[(0.5 * N[(N[(N[Sqrt[N[(im * -0.5), $MachinePrecision]], $MachinePrecision] / N[(N[Sqrt[(-re)], $MachinePrecision] / N[Sqrt[(-im)], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[Sqrt[2.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[re, -3.7e+50], N[(0.5 * N[Sqrt[N[(2.0 * N[(N[(0.125 * N[(im * N[Power[N[(im / re), $MachinePrecision], 3.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[(-0.5 * N[(im * N[(im / re), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[(0.5 * N[(N[Sqrt[2.0], $MachinePrecision] * N[Sqrt[N[(1.0 / N[(1.0 / N[(re + N[Sqrt[re ^ 2 + im ^ 2], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]]
0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
\begin{array}{l}
\mathbf{if}\;re \leq -1.6 \cdot 10^{+235}:\\
\;\;\;\;0.5 \cdot \sqrt{\frac{-im}{\frac{re}{im}}}\\
\mathbf{elif}\;re \leq -1.26 \cdot 10^{+132}:\\
\;\;\;\;0.5 \cdot \left(\frac{\sqrt{im \cdot -0.5}}{\frac{\sqrt{-re}}{\sqrt{-im}}} \cdot \sqrt{2}\right)\\
\mathbf{elif}\;re \leq -3.7 \cdot 10^{+50}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(0.125 \cdot \left(im \cdot {\left(\frac{im}{re}\right)}^{3}\right) + -0.5 \cdot \left(im \cdot \frac{im}{re}\right)\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \left(\sqrt{2} \cdot \sqrt{\frac{1}{\frac{1}{re + \mathsf{hypot}\left(re, im\right)}}}\right)\\
\end{array}
Results
| Original | 59.39% |
|---|---|
| Target | 51.81% |
| Herbie | 18.38% |
if re < -1.60000000000000003e235Initial program 100
Simplified67.41
[Start]100 | \[ 0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
\] |
|---|---|
+-commutative [=>]100 | \[ 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(re + \sqrt{re \cdot re + im \cdot im}\right)}}
\] |
hypot-def [=>]67.41 | \[ 0.5 \cdot \sqrt{2 \cdot \left(re + \color{blue}{\mathsf{hypot}\left(re, im\right)}\right)}
\] |
Taylor expanded in re around -inf 62.53
Simplified62.58
[Start]62.53 | \[ 0.5 \cdot \sqrt{2 \cdot \left(0.125 \cdot \frac{{im}^{4}}{{re}^{3}} + -0.5 \cdot \frac{{im}^{2}}{re}\right)}
\] |
|---|---|
+-commutative [=>]62.53 | \[ 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(-0.5 \cdot \frac{{im}^{2}}{re} + 0.125 \cdot \frac{{im}^{4}}{{re}^{3}}\right)}}
\] |
fma-def [=>]62.53 | \[ 0.5 \cdot \sqrt{2 \cdot \color{blue}{\mathsf{fma}\left(-0.5, \frac{{im}^{2}}{re}, 0.125 \cdot \frac{{im}^{4}}{{re}^{3}}\right)}}
\] |
unpow2 [=>]62.53 | \[ 0.5 \cdot \sqrt{2 \cdot \mathsf{fma}\left(-0.5, \frac{\color{blue}{im \cdot im}}{re}, 0.125 \cdot \frac{{im}^{4}}{{re}^{3}}\right)}
\] |
associate-/l* [=>]62.58 | \[ 0.5 \cdot \sqrt{2 \cdot \mathsf{fma}\left(-0.5, \color{blue}{\frac{im}{\frac{re}{im}}}, 0.125 \cdot \frac{{im}^{4}}{{re}^{3}}\right)}
\] |
associate-*r/ [=>]62.58 | \[ 0.5 \cdot \sqrt{2 \cdot \mathsf{fma}\left(-0.5, \frac{im}{\frac{re}{im}}, \color{blue}{\frac{0.125 \cdot {im}^{4}}{{re}^{3}}}\right)}
\] |
associate-/l* [=>]62.58 | \[ 0.5 \cdot \sqrt{2 \cdot \mathsf{fma}\left(-0.5, \frac{im}{\frac{re}{im}}, \color{blue}{\frac{0.125}{\frac{{re}^{3}}{{im}^{4}}}}\right)}
\] |
Taylor expanded in im around 0 52.38
Simplified30.59
[Start]52.38 | \[ 0.5 \cdot \sqrt{2 \cdot \left(-0.5 \cdot \frac{{im}^{2}}{re}\right)}
\] |
|---|---|
unpow2 [=>]52.38 | \[ 0.5 \cdot \sqrt{2 \cdot \left(-0.5 \cdot \frac{\color{blue}{im \cdot im}}{re}\right)}
\] |
associate-*r/ [<=]30.59 | \[ 0.5 \cdot \sqrt{2 \cdot \left(-0.5 \cdot \color{blue}{\left(im \cdot \frac{im}{re}\right)}\right)}
\] |
associate-*r* [=>]30.59 | \[ 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(\left(-0.5 \cdot im\right) \cdot \frac{im}{re}\right)}}
\] |
*-commutative [=>]30.59 | \[ 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(\frac{im}{re} \cdot \left(-0.5 \cdot im\right)\right)}}
\] |
Applied egg-rr50.38
Simplified30.63
[Start]50.38 | \[ 0.5 \cdot \left(e^{\mathsf{log1p}\left(\sqrt{\frac{-1}{\frac{re}{im}} \cdot im}\right)} - 1\right)
\] |
|---|---|
expm1-def [=>]32.23 | \[ 0.5 \cdot \color{blue}{\mathsf{expm1}\left(\mathsf{log1p}\left(\sqrt{\frac{-1}{\frac{re}{im}} \cdot im}\right)\right)}
\] |
expm1-log1p [=>]30.67 | \[ 0.5 \cdot \color{blue}{\sqrt{\frac{-1}{\frac{re}{im}} \cdot im}}
\] |
associate-*l/ [=>]30.63 | \[ 0.5 \cdot \sqrt{\color{blue}{\frac{-1 \cdot im}{\frac{re}{im}}}}
\] |
neg-mul-1 [<=]30.63 | \[ 0.5 \cdot \sqrt{\frac{\color{blue}{-im}}{\frac{re}{im}}}
\] |
if -1.60000000000000003e235 < re < -1.25999999999999999e132Initial program 96.73
Simplified62.7
[Start]96.73 | \[ 0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
\] |
|---|---|
+-commutative [=>]96.73 | \[ 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(re + \sqrt{re \cdot re + im \cdot im}\right)}}
\] |
hypot-def [=>]62.7 | \[ 0.5 \cdot \sqrt{2 \cdot \left(re + \color{blue}{\mathsf{hypot}\left(re, im\right)}\right)}
\] |
Applied egg-rr62.83
Applied egg-rr62.83
Taylor expanded in re around -inf 50.01
Simplified43.05
[Start]50.01 | \[ 0.5 \cdot \left(\sqrt{-0.5 \cdot \frac{{im}^{2}}{re}} \cdot \sqrt{2}\right)
\] |
|---|---|
unpow2 [=>]50.01 | \[ 0.5 \cdot \left(\sqrt{-0.5 \cdot \frac{\color{blue}{im \cdot im}}{re}} \cdot \sqrt{2}\right)
\] |
associate-/l* [=>]43.05 | \[ 0.5 \cdot \left(\sqrt{-0.5 \cdot \color{blue}{\frac{im}{\frac{re}{im}}}} \cdot \sqrt{2}\right)
\] |
Applied egg-rr54.74
Simplified54.77
[Start]54.74 | \[ 0.5 \cdot \left(\left(\frac{\sqrt{-0.5 \cdot im}}{\sqrt{-re}} \cdot \sqrt{-im}\right) \cdot \sqrt{2}\right)
\] |
|---|---|
associate-/r/ [<=]54.77 | \[ 0.5 \cdot \left(\color{blue}{\frac{\sqrt{-0.5 \cdot im}}{\frac{\sqrt{-re}}{\sqrt{-im}}}} \cdot \sqrt{2}\right)
\] |
if -1.25999999999999999e132 < re < -3.7000000000000001e50Initial program 80.85
Simplified53.56
[Start]80.85 | \[ 0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
\] |
|---|---|
+-commutative [=>]80.85 | \[ 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(re + \sqrt{re \cdot re + im \cdot im}\right)}}
\] |
hypot-def [=>]53.56 | \[ 0.5 \cdot \sqrt{2 \cdot \left(re + \color{blue}{\mathsf{hypot}\left(re, im\right)}\right)}
\] |
Taylor expanded in re around -inf 65.63
Simplified65.62
[Start]65.63 | \[ 0.5 \cdot \sqrt{2 \cdot \left(0.125 \cdot \frac{{im}^{4}}{{re}^{3}} + -0.5 \cdot \frac{{im}^{2}}{re}\right)}
\] |
|---|---|
+-commutative [=>]65.63 | \[ 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(-0.5 \cdot \frac{{im}^{2}}{re} + 0.125 \cdot \frac{{im}^{4}}{{re}^{3}}\right)}}
\] |
fma-def [=>]65.63 | \[ 0.5 \cdot \sqrt{2 \cdot \color{blue}{\mathsf{fma}\left(-0.5, \frac{{im}^{2}}{re}, 0.125 \cdot \frac{{im}^{4}}{{re}^{3}}\right)}}
\] |
unpow2 [=>]65.63 | \[ 0.5 \cdot \sqrt{2 \cdot \mathsf{fma}\left(-0.5, \frac{\color{blue}{im \cdot im}}{re}, 0.125 \cdot \frac{{im}^{4}}{{re}^{3}}\right)}
\] |
associate-/l* [=>]65.62 | \[ 0.5 \cdot \sqrt{2 \cdot \mathsf{fma}\left(-0.5, \color{blue}{\frac{im}{\frac{re}{im}}}, 0.125 \cdot \frac{{im}^{4}}{{re}^{3}}\right)}
\] |
associate-*r/ [=>]65.62 | \[ 0.5 \cdot \sqrt{2 \cdot \mathsf{fma}\left(-0.5, \frac{im}{\frac{re}{im}}, \color{blue}{\frac{0.125 \cdot {im}^{4}}{{re}^{3}}}\right)}
\] |
associate-/l* [=>]65.62 | \[ 0.5 \cdot \sqrt{2 \cdot \mathsf{fma}\left(-0.5, \frac{im}{\frac{re}{im}}, \color{blue}{\frac{0.125}{\frac{{re}^{3}}{{im}^{4}}}}\right)}
\] |
Applied egg-rr65.6
Applied egg-rr62.73
Simplified62.73
[Start]62.73 | \[ 0.5 \cdot \sqrt{2 \cdot \left(0.125 \cdot \left(\left(im \cdot \frac{im}{re}\right) \cdot {\left(\frac{im}{re}\right)}^{2}\right) + -0.5 \cdot \left(im \cdot \frac{im}{re}\right)\right)}
\] |
|---|---|
associate-*l* [=>]62.73 | \[ 0.5 \cdot \sqrt{2 \cdot \left(0.125 \cdot \color{blue}{\left(im \cdot \left(\frac{im}{re} \cdot {\left(\frac{im}{re}\right)}^{2}\right)\right)} + -0.5 \cdot \left(im \cdot \frac{im}{re}\right)\right)}
\] |
unpow2 [=>]62.73 | \[ 0.5 \cdot \sqrt{2 \cdot \left(0.125 \cdot \left(im \cdot \left(\frac{im}{re} \cdot \color{blue}{\left(\frac{im}{re} \cdot \frac{im}{re}\right)}\right)\right) + -0.5 \cdot \left(im \cdot \frac{im}{re}\right)\right)}
\] |
cube-mult [<=]62.73 | \[ 0.5 \cdot \sqrt{2 \cdot \left(0.125 \cdot \left(im \cdot \color{blue}{{\left(\frac{im}{re}\right)}^{3}}\right) + -0.5 \cdot \left(im \cdot \frac{im}{re}\right)\right)}
\] |
if -3.7000000000000001e50 < re Initial program 50.98
Simplified9.71
[Start]50.98 | \[ 0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
\] |
|---|---|
+-commutative [=>]50.98 | \[ 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(re + \sqrt{re \cdot re + im \cdot im}\right)}}
\] |
hypot-def [=>]9.71 | \[ 0.5 \cdot \sqrt{2 \cdot \left(re + \color{blue}{\mathsf{hypot}\left(re, im\right)}\right)}
\] |
Applied egg-rr10.28
Applied egg-rr10.32
Final simplification18.38
| Alternative 1 | |
|---|---|
| Error | 17.42% |
| Cost | 20100 |
| Alternative 2 | |
|---|---|
| Error | 17.39% |
| Cost | 19844 |
| Alternative 3 | |
|---|---|
| Error | 16.91% |
| Cost | 13444 |
| Alternative 4 | |
|---|---|
| Error | 47.88% |
| Cost | 7640 |
| Alternative 5 | |
|---|---|
| Error | 48.1% |
| Cost | 7640 |
| Alternative 6 | |
|---|---|
| Error | 42.16% |
| Cost | 7376 |
| Alternative 7 | |
|---|---|
| Error | 40.91% |
| Cost | 7376 |
| Alternative 8 | |
|---|---|
| Error | 42.61% |
| Cost | 7248 |
| Alternative 9 | |
|---|---|
| Error | 47.49% |
| Cost | 6852 |
| Alternative 10 | |
|---|---|
| Error | 74.42% |
| Cost | 6720 |
herbie shell --seed 2023102
(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)))))