| Alternative 1 | |
|---|---|
| Accuracy | 99.2% |
| Cost | 708 |
(FPCore (a b) :precision binary64 (sqrt (- (* a a) (* b b))))
(FPCore (a b) :precision binary64 (if (<= a -5e-289) (- (/ (* b 0.5) (/ a b)) a) (fma -0.5 (/ b (/ a b)) a)))
double code(double a, double b) {
return sqrt(((a * a) - (b * b)));
}
double code(double a, double b) {
double tmp;
if (a <= -5e-289) {
tmp = ((b * 0.5) / (a / b)) - a;
} else {
tmp = fma(-0.5, (b / (a / b)), a);
}
return tmp;
}
function code(a, b) return sqrt(Float64(Float64(a * a) - Float64(b * b))) end
function code(a, b) tmp = 0.0 if (a <= -5e-289) tmp = Float64(Float64(Float64(b * 0.5) / Float64(a / b)) - a); else tmp = fma(-0.5, Float64(b / Float64(a / b)), a); end return tmp end
code[a_, b_] := N[Sqrt[N[(N[(a * a), $MachinePrecision] - N[(b * b), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
code[a_, b_] := If[LessEqual[a, -5e-289], N[(N[(N[(b * 0.5), $MachinePrecision] / N[(a / b), $MachinePrecision]), $MachinePrecision] - a), $MachinePrecision], N[(-0.5 * N[(b / N[(a / b), $MachinePrecision]), $MachinePrecision] + a), $MachinePrecision]]
\sqrt{a \cdot a - b \cdot b}
\begin{array}{l}
\mathbf{if}\;a \leq -5 \cdot 10^{-289}:\\
\;\;\;\;\frac{b \cdot 0.5}{\frac{a}{b}} - a\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(-0.5, \frac{b}{\frac{a}{b}}, a\right)\\
\end{array}
| Original | 53.3% |
|---|---|
| Target | 99.2% |
| Herbie | 99.5% |
if a < -5.00000000000000029e-289Initial program 51.3%
Simplified51.8%
[Start]51.3 | \[ \sqrt{a \cdot a - b \cdot b}
\] |
|---|---|
difference-of-squares [=>]51.8 | \[ \sqrt{\color{blue}{\left(a + b\right) \cdot \left(a - b\right)}}
\] |
Applied egg-rr51.5%
[Start]51.8 | \[ \sqrt{\left(a + b\right) \cdot \left(a - b\right)}
\] |
|---|---|
add-sqr-sqrt [=>]51.5 | \[ \color{blue}{\sqrt{\sqrt{\left(a + b\right) \cdot \left(a - b\right)}} \cdot \sqrt{\sqrt{\left(a + b\right) \cdot \left(a - b\right)}}}
\] |
pow2 [=>]51.5 | \[ \color{blue}{{\left(\sqrt{\sqrt{\left(a + b\right) \cdot \left(a - b\right)}}\right)}^{2}}
\] |
pow1/2 [=>]51.5 | \[ {\left(\sqrt{\color{blue}{{\left(\left(a + b\right) \cdot \left(a - b\right)\right)}^{0.5}}}\right)}^{2}
\] |
sqrt-pow1 [=>]51.5 | \[ {\color{blue}{\left({\left(\left(a + b\right) \cdot \left(a - b\right)\right)}^{\left(\frac{0.5}{2}\right)}\right)}}^{2}
\] |
difference-of-squares [<=]51.0 | \[ {\left({\color{blue}{\left(a \cdot a - b \cdot b\right)}}^{\left(\frac{0.5}{2}\right)}\right)}^{2}
\] |
fma-neg [=>]51.5 | \[ {\left({\color{blue}{\left(\mathsf{fma}\left(a, a, -b \cdot b\right)\right)}}^{\left(\frac{0.5}{2}\right)}\right)}^{2}
\] |
metadata-eval [=>]51.5 | \[ {\left({\left(\mathsf{fma}\left(a, a, -b \cdot b\right)\right)}^{\color{blue}{0.25}}\right)}^{2}
\] |
Taylor expanded in a around -inf 94.2%
Simplified94.2%
[Start]94.2 | \[ 0.5 \cdot \frac{{b}^{2}}{a} + -1 \cdot a
\] |
|---|---|
mul-1-neg [=>]94.2 | \[ 0.5 \cdot \frac{{b}^{2}}{a} + \color{blue}{\left(-a\right)}
\] |
unsub-neg [=>]94.2 | \[ \color{blue}{0.5 \cdot \frac{{b}^{2}}{a} - a}
\] |
*-commutative [=>]94.2 | \[ \color{blue}{\frac{{b}^{2}}{a} \cdot 0.5} - a
\] |
unpow2 [=>]94.2 | \[ \frac{\color{blue}{b \cdot b}}{a} \cdot 0.5 - a
\] |
Applied egg-rr99.7%
[Start]94.2 | \[ \frac{b \cdot b}{a} \cdot 0.5 - a
\] |
|---|---|
associate-/l* [=>]99.7 | \[ \color{blue}{\frac{b}{\frac{a}{b}}} \cdot 0.5 - a
\] |
associate-*l/ [=>]99.7 | \[ \color{blue}{\frac{b \cdot 0.5}{\frac{a}{b}}} - a
\] |
if -5.00000000000000029e-289 < a Initial program 54.5%
Simplified55.2%
[Start]54.5 | \[ \sqrt{a \cdot a - b \cdot b}
\] |
|---|---|
difference-of-squares [=>]55.2 | \[ \sqrt{\color{blue}{\left(a + b\right) \cdot \left(a - b\right)}}
\] |
Taylor expanded in a around inf 92.8%
Simplified100.0%
[Start]92.8 | \[ 0.5 \cdot \left(b + -1 \cdot b\right) + \left(0.5 \cdot \frac{-1 \cdot {b}^{2} - {\left(0.5 \cdot \left(b + -1 \cdot b\right)\right)}^{2}}{a} + a\right)
\] |
|---|---|
fma-def [=>]92.8 | \[ \color{blue}{\mathsf{fma}\left(0.5, b + -1 \cdot b, 0.5 \cdot \frac{-1 \cdot {b}^{2} - {\left(0.5 \cdot \left(b + -1 \cdot b\right)\right)}^{2}}{a} + a\right)}
\] |
distribute-rgt1-in [=>]92.8 | \[ \mathsf{fma}\left(0.5, \color{blue}{\left(-1 + 1\right) \cdot b}, 0.5 \cdot \frac{-1 \cdot {b}^{2} - {\left(0.5 \cdot \left(b + -1 \cdot b\right)\right)}^{2}}{a} + a\right)
\] |
metadata-eval [=>]92.8 | \[ \mathsf{fma}\left(0.5, \color{blue}{0} \cdot b, 0.5 \cdot \frac{-1 \cdot {b}^{2} - {\left(0.5 \cdot \left(b + -1 \cdot b\right)\right)}^{2}}{a} + a\right)
\] |
mul0-lft [=>]92.8 | \[ \mathsf{fma}\left(0.5, \color{blue}{0}, 0.5 \cdot \frac{-1 \cdot {b}^{2} - {\left(0.5 \cdot \left(b + -1 \cdot b\right)\right)}^{2}}{a} + a\right)
\] |
fma-udef [=>]92.8 | \[ \color{blue}{0.5 \cdot 0 + \left(0.5 \cdot \frac{-1 \cdot {b}^{2} - {\left(0.5 \cdot \left(b + -1 \cdot b\right)\right)}^{2}}{a} + a\right)}
\] |
metadata-eval [=>]92.8 | \[ \color{blue}{0} + \left(0.5 \cdot \frac{-1 \cdot {b}^{2} - {\left(0.5 \cdot \left(b + -1 \cdot b\right)\right)}^{2}}{a} + a\right)
\] |
+-lft-identity [=>]92.8 | \[ \color{blue}{0.5 \cdot \frac{-1 \cdot {b}^{2} - {\left(0.5 \cdot \left(b + -1 \cdot b\right)\right)}^{2}}{a} + a}
\] |
Final simplification99.9%
| Alternative 1 | |
|---|---|
| Accuracy | 99.2% |
| Cost | 708 |
| Alternative 2 | |
|---|---|
| Accuracy | 99.0% |
| Cost | 260 |
| Alternative 3 | |
|---|---|
| Accuracy | 50.5% |
| Cost | 64 |
herbie shell --seed 2023160
(FPCore (a b)
:name "bug366, discussion (missed optimization)"
:precision binary64
:herbie-target
(* (sqrt (+ (fabs a) (fabs b))) (sqrt (- (fabs a) (fabs b))))
(sqrt (- (* a a) (* b b))))