| Alternative 1 | |
|---|---|
| Accuracy | 59.2% |
| Cost | 7112 |

(FPCore (re im) :precision binary64 (* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))
(FPCore (re im)
:precision binary64
(if (<= re -1.05e+224)
(* 0.5 (sqrt (* (- im) (/ im re))))
(if (or (<= re -4.4e+72) (not (<= re -1.06e-10)))
(* 0.5 (sqrt (* 2.0 (+ re (hypot re im)))))
(* 0.5 (sqrt (/ (* im im) (- 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 tmp;
if (re <= -1.05e+224) {
tmp = 0.5 * sqrt((-im * (im / re)));
} else if ((re <= -4.4e+72) || !(re <= -1.06e-10)) {
tmp = 0.5 * sqrt((2.0 * (re + hypot(re, im))));
} else {
tmp = 0.5 * sqrt(((im * im) / -re));
}
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.05e+224) {
tmp = 0.5 * Math.sqrt((-im * (im / re)));
} else if ((re <= -4.4e+72) || !(re <= -1.06e-10)) {
tmp = 0.5 * Math.sqrt((2.0 * (re + Math.hypot(re, im))));
} else {
tmp = 0.5 * Math.sqrt(((im * im) / -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): tmp = 0 if re <= -1.05e+224: tmp = 0.5 * math.sqrt((-im * (im / re))) elif (re <= -4.4e+72) or not (re <= -1.06e-10): tmp = 0.5 * math.sqrt((2.0 * (re + math.hypot(re, im)))) else: tmp = 0.5 * math.sqrt(((im * im) / -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) tmp = 0.0 if (re <= -1.05e+224) tmp = Float64(0.5 * sqrt(Float64(Float64(-im) * Float64(im / re)))); elseif ((re <= -4.4e+72) || !(re <= -1.06e-10)) tmp = Float64(0.5 * sqrt(Float64(2.0 * Float64(re + hypot(re, im))))); else tmp = Float64(0.5 * sqrt(Float64(Float64(im * im) / Float64(-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) tmp = 0.0; if (re <= -1.05e+224) tmp = 0.5 * sqrt((-im * (im / re))); elseif ((re <= -4.4e+72) || ~((re <= -1.06e-10))) tmp = 0.5 * sqrt((2.0 * (re + hypot(re, im)))); else tmp = 0.5 * sqrt(((im * im) / -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_] := If[LessEqual[re, -1.05e+224], N[(0.5 * N[Sqrt[N[((-im) * N[(im / re), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], If[Or[LessEqual[re, -4.4e+72], N[Not[LessEqual[re, -1.06e-10]], $MachinePrecision]], N[(0.5 * N[Sqrt[N[(2.0 * N[(re + N[Sqrt[re ^ 2 + im ^ 2], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[(0.5 * N[Sqrt[N[(N[(im * im), $MachinePrecision] / (-re)), $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.05 \cdot 10^{+224}:\\
\;\;\;\;0.5 \cdot \sqrt{\left(-im\right) \cdot \frac{im}{re}}\\
\mathbf{elif}\;re \leq -4.4 \cdot 10^{+72} \lor \neg \left(re \leq -1.06 \cdot 10^{-10}\right):\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{\frac{im \cdot im}{-re}}\\
\end{array}
Results
| Original | 40.6% |
|---|---|
| Target | 48.0% |
| Herbie | 80.8% |
if re < -1.0500000000000001e224Initial program 2.4%
Simplified45.8%
[Start]2.4 | \[ 0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
\] |
|---|---|
+-commutative [=>]2.4 | \[ 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(re + \sqrt{re \cdot re + im \cdot im}\right)}}
\] |
hypot-def [=>]45.8 | \[ 0.5 \cdot \sqrt{2 \cdot \left(re + \color{blue}{\mathsf{hypot}\left(re, im\right)}\right)}
\] |
Taylor expanded in re around -inf 64.0%
Simplified88.0%
[Start]64.0 | \[ 0.5 \cdot \sqrt{2 \cdot \left(-0.5 \cdot \frac{{im}^{2}}{re}\right)}
\] |
|---|---|
*-commutative [=>]64.0 | \[ 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(\frac{{im}^{2}}{re} \cdot -0.5\right)}}
\] |
unpow2 [=>]64.0 | \[ 0.5 \cdot \sqrt{2 \cdot \left(\frac{\color{blue}{im \cdot im}}{re} \cdot -0.5\right)}
\] |
associate-/l* [=>]88.0 | \[ 0.5 \cdot \sqrt{2 \cdot \left(\color{blue}{\frac{im}{\frac{re}{im}}} \cdot -0.5\right)}
\] |
Applied egg-rr88.0%
[Start]88.0 | \[ 0.5 \cdot \sqrt{2 \cdot \left(\frac{im}{\frac{re}{im}} \cdot -0.5\right)}
\] |
|---|---|
add-log-exp [=>]46.1 | \[ 0.5 \cdot \color{blue}{\log \left(e^{\sqrt{2 \cdot \left(\frac{im}{\frac{re}{im}} \cdot -0.5\right)}}\right)}
\] |
*-un-lft-identity [=>]46.1 | \[ 0.5 \cdot \log \color{blue}{\left(1 \cdot e^{\sqrt{2 \cdot \left(\frac{im}{\frac{re}{im}} \cdot -0.5\right)}}\right)}
\] |
log-prod [=>]46.1 | \[ 0.5 \cdot \color{blue}{\left(\log 1 + \log \left(e^{\sqrt{2 \cdot \left(\frac{im}{\frac{re}{im}} \cdot -0.5\right)}}\right)\right)}
\] |
metadata-eval [=>]46.1 | \[ 0.5 \cdot \left(\color{blue}{0} + \log \left(e^{\sqrt{2 \cdot \left(\frac{im}{\frac{re}{im}} \cdot -0.5\right)}}\right)\right)
\] |
add-log-exp [<=]88.0 | \[ 0.5 \cdot \left(0 + \color{blue}{\sqrt{2 \cdot \left(\frac{im}{\frac{re}{im}} \cdot -0.5\right)}}\right)
\] |
*-commutative [=>]88.0 | \[ 0.5 \cdot \left(0 + \sqrt{\color{blue}{\left(\frac{im}{\frac{re}{im}} \cdot -0.5\right) \cdot 2}}\right)
\] |
associate-*l* [=>]88.0 | \[ 0.5 \cdot \left(0 + \sqrt{\color{blue}{\frac{im}{\frac{re}{im}} \cdot \left(-0.5 \cdot 2\right)}}\right)
\] |
associate-/r/ [=>]88.0 | \[ 0.5 \cdot \left(0 + \sqrt{\color{blue}{\left(\frac{im}{re} \cdot im\right)} \cdot \left(-0.5 \cdot 2\right)}\right)
\] |
*-commutative [<=]88.0 | \[ 0.5 \cdot \left(0 + \sqrt{\color{blue}{\left(im \cdot \frac{im}{re}\right)} \cdot \left(-0.5 \cdot 2\right)}\right)
\] |
metadata-eval [=>]88.0 | \[ 0.5 \cdot \left(0 + \sqrt{\left(im \cdot \frac{im}{re}\right) \cdot \color{blue}{-1}}\right)
\] |
Simplified88.0%
[Start]88.0 | \[ 0.5 \cdot \left(0 + \sqrt{\left(im \cdot \frac{im}{re}\right) \cdot -1}\right)
\] |
|---|---|
+-lft-identity [=>]88.0 | \[ 0.5 \cdot \color{blue}{\sqrt{\left(im \cdot \frac{im}{re}\right) \cdot -1}}
\] |
associate-*l* [=>]88.0 | \[ 0.5 \cdot \sqrt{\color{blue}{im \cdot \left(\frac{im}{re} \cdot -1\right)}}
\] |
associate-*l/ [=>]88.0 | \[ 0.5 \cdot \sqrt{im \cdot \color{blue}{\frac{im \cdot -1}{re}}}
\] |
*-commutative [<=]88.0 | \[ 0.5 \cdot \sqrt{im \cdot \frac{\color{blue}{-1 \cdot im}}{re}}
\] |
neg-mul-1 [<=]88.0 | \[ 0.5 \cdot \sqrt{im \cdot \frac{\color{blue}{-im}}{re}}
\] |
if -1.0500000000000001e224 < re < -4.4e72 or -1.06e-10 < re Initial program 46.1%
Simplified90.3%
[Start]46.1 | \[ 0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
\] |
|---|---|
+-commutative [=>]46.1 | \[ 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(re + \sqrt{re \cdot re + im \cdot im}\right)}}
\] |
hypot-def [=>]90.3 | \[ 0.5 \cdot \sqrt{2 \cdot \left(re + \color{blue}{\mathsf{hypot}\left(re, im\right)}\right)}
\] |
if -4.4e72 < re < -1.06e-10Initial program 14.8%
Simplified23.9%
[Start]14.8 | \[ 0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
\] |
|---|---|
+-commutative [=>]14.8 | \[ 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(re + \sqrt{re \cdot re + im \cdot im}\right)}}
\] |
hypot-def [=>]23.9 | \[ 0.5 \cdot \sqrt{2 \cdot \left(re + \color{blue}{\mathsf{hypot}\left(re, im\right)}\right)}
\] |
Taylor expanded in re around -inf 59.7%
Simplified59.7%
[Start]59.7 | \[ 0.5 \cdot \sqrt{2 \cdot \left(-0.5 \cdot \frac{{im}^{2}}{re}\right)}
\] |
|---|---|
*-commutative [=>]59.7 | \[ 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(\frac{{im}^{2}}{re} \cdot -0.5\right)}}
\] |
unpow2 [=>]59.7 | \[ 0.5 \cdot \sqrt{2 \cdot \left(\frac{\color{blue}{im \cdot im}}{re} \cdot -0.5\right)}
\] |
associate-/l* [=>]59.7 | \[ 0.5 \cdot \sqrt{2 \cdot \left(\color{blue}{\frac{im}{\frac{re}{im}}} \cdot -0.5\right)}
\] |
Applied egg-rr59.7%
[Start]59.7 | \[ 0.5 \cdot \sqrt{2 \cdot \left(\frac{im}{\frac{re}{im}} \cdot -0.5\right)}
\] |
|---|---|
add-log-exp [=>]16.9 | \[ 0.5 \cdot \color{blue}{\log \left(e^{\sqrt{2 \cdot \left(\frac{im}{\frac{re}{im}} \cdot -0.5\right)}}\right)}
\] |
*-un-lft-identity [=>]16.9 | \[ 0.5 \cdot \log \color{blue}{\left(1 \cdot e^{\sqrt{2 \cdot \left(\frac{im}{\frac{re}{im}} \cdot -0.5\right)}}\right)}
\] |
log-prod [=>]16.9 | \[ 0.5 \cdot \color{blue}{\left(\log 1 + \log \left(e^{\sqrt{2 \cdot \left(\frac{im}{\frac{re}{im}} \cdot -0.5\right)}}\right)\right)}
\] |
metadata-eval [=>]16.9 | \[ 0.5 \cdot \left(\color{blue}{0} + \log \left(e^{\sqrt{2 \cdot \left(\frac{im}{\frac{re}{im}} \cdot -0.5\right)}}\right)\right)
\] |
add-log-exp [<=]59.7 | \[ 0.5 \cdot \left(0 + \color{blue}{\sqrt{2 \cdot \left(\frac{im}{\frac{re}{im}} \cdot -0.5\right)}}\right)
\] |
*-commutative [=>]59.7 | \[ 0.5 \cdot \left(0 + \sqrt{\color{blue}{\left(\frac{im}{\frac{re}{im}} \cdot -0.5\right) \cdot 2}}\right)
\] |
associate-*l* [=>]59.7 | \[ 0.5 \cdot \left(0 + \sqrt{\color{blue}{\frac{im}{\frac{re}{im}} \cdot \left(-0.5 \cdot 2\right)}}\right)
\] |
associate-/r/ [=>]59.7 | \[ 0.5 \cdot \left(0 + \sqrt{\color{blue}{\left(\frac{im}{re} \cdot im\right)} \cdot \left(-0.5 \cdot 2\right)}\right)
\] |
*-commutative [<=]59.7 | \[ 0.5 \cdot \left(0 + \sqrt{\color{blue}{\left(im \cdot \frac{im}{re}\right)} \cdot \left(-0.5 \cdot 2\right)}\right)
\] |
metadata-eval [=>]59.7 | \[ 0.5 \cdot \left(0 + \sqrt{\left(im \cdot \frac{im}{re}\right) \cdot \color{blue}{-1}}\right)
\] |
Simplified59.7%
[Start]59.7 | \[ 0.5 \cdot \left(0 + \sqrt{\left(im \cdot \frac{im}{re}\right) \cdot -1}\right)
\] |
|---|---|
+-lft-identity [=>]59.7 | \[ 0.5 \cdot \color{blue}{\sqrt{\left(im \cdot \frac{im}{re}\right) \cdot -1}}
\] |
associate-*l* [=>]59.7 | \[ 0.5 \cdot \sqrt{\color{blue}{im \cdot \left(\frac{im}{re} \cdot -1\right)}}
\] |
associate-*l/ [=>]59.7 | \[ 0.5 \cdot \sqrt{im \cdot \color{blue}{\frac{im \cdot -1}{re}}}
\] |
*-commutative [<=]59.7 | \[ 0.5 \cdot \sqrt{im \cdot \frac{\color{blue}{-1 \cdot im}}{re}}
\] |
neg-mul-1 [<=]59.7 | \[ 0.5 \cdot \sqrt{im \cdot \frac{\color{blue}{-im}}{re}}
\] |
Applied egg-rr59.7%
[Start]59.7 | \[ 0.5 \cdot \sqrt{im \cdot \frac{-im}{re}}
\] |
|---|---|
associate-*r/ [=>]59.7 | \[ 0.5 \cdot \sqrt{\color{blue}{\frac{im \cdot \left(-im\right)}{re}}}
\] |
frac-2neg [=>]59.7 | \[ 0.5 \cdot \sqrt{\color{blue}{\frac{-im \cdot \left(-im\right)}{-re}}}
\] |
distribute-lft-neg-out [<=]59.7 | \[ 0.5 \cdot \sqrt{\frac{\color{blue}{\left(-im\right) \cdot \left(-im\right)}}{-re}}
\] |
sqr-neg [=>]59.7 | \[ 0.5 \cdot \sqrt{\frac{\color{blue}{im \cdot im}}{-re}}
\] |
Final simplification87.6%
| Alternative 1 | |
|---|---|
| Accuracy | 59.2% |
| Cost | 7112 |
| Alternative 2 | |
|---|---|
| Accuracy | 59.9% |
| Cost | 7112 |
| Alternative 3 | |
|---|---|
| Accuracy | 30.7% |
| Cost | 6984 |
| Alternative 4 | |
|---|---|
| Accuracy | 43.7% |
| Cost | 6984 |
| Alternative 5 | |
|---|---|
| Accuracy | 58.9% |
| Cost | 6984 |
| Alternative 6 | |
|---|---|
| Accuracy | 8.8% |
| Cost | 196 |
| Alternative 7 | |
|---|---|
| Accuracy | 8.8% |
| Cost | 196 |
| Alternative 8 | |
|---|---|
| Accuracy | 8.9% |
| Cost | 196 |
| Alternative 9 | |
|---|---|
| Accuracy | 8.9% |
| Cost | 196 |
| Alternative 10 | |
|---|---|
| Accuracy | 8.9% |
| Cost | 196 |
| Alternative 11 | |
|---|---|
| Accuracy | 8.9% |
| Cost | 196 |
| Alternative 12 | |
|---|---|
| Accuracy | 8.9% |
| Cost | 196 |
| Alternative 13 | |
|---|---|
| Accuracy | 8.9% |
| Cost | 196 |
| Alternative 14 | |
|---|---|
| Accuracy | 8.9% |
| Cost | 196 |
| Alternative 15 | |
|---|---|
| Accuracy | 8.9% |
| Cost | 196 |
| Alternative 16 | |
|---|---|
| Accuracy | 6.2% |
| Cost | 64 |
herbie shell --seed 2023159
(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)))))