| Alternative 1 | |
|---|---|
| Accuracy | 99.4% |
| Cost | 6980 |

(FPCore (a b) :precision binary64 (sqrt (- (* a a) (* b b))))
(FPCore (a b) :precision binary64 (if (<= a -1e-285) (- (* (* b (/ b a)) 0.5) 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 <= -1e-285) {
tmp = ((b * (b / a)) * 0.5) - 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 <= -1e-285) tmp = Float64(Float64(Float64(b * Float64(b / a)) * 0.5) - 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, -1e-285], N[(N[(N[(b * N[(b / a), $MachinePrecision]), $MachinePrecision] * 0.5), $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}
\\
\begin{array}{l}
\mathbf{if}\;a \leq -1 \cdot 10^{-285}:\\
\;\;\;\;\left(b \cdot \frac{b}{a}\right) \cdot 0.5 - a\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(-0.5, \frac{b}{\frac{a}{b}}, a\right)\\
\end{array}
\end{array}
Herbie found 4 alternatives:
| Alternative | Accuracy | Speedup |
|---|
| Original | 53.2% |
|---|---|
| Target | 99.2% |
| Herbie | 99.4% |
if a < -1.00000000000000007e-285Initial program 51.1%
Simplified51.7%
[Start]51.1% | \[ \sqrt{a \cdot a - b \cdot b}
\] |
|---|---|
difference-of-squares [=>]51.7% | \[ \sqrt{\color{blue}{\left(a + b\right) \cdot \left(a - b\right)}}
\] |
Applied egg-rr47.6%
[Start]51.7% | \[ \sqrt{\left(a + b\right) \cdot \left(a - b\right)}
\] |
|---|---|
add-cube-cbrt [=>]50.7% | \[ \color{blue}{\left(\sqrt[3]{\sqrt{\left(a + b\right) \cdot \left(a - b\right)}} \cdot \sqrt[3]{\sqrt{\left(a + b\right) \cdot \left(a - b\right)}}\right) \cdot \sqrt[3]{\sqrt{\left(a + b\right) \cdot \left(a - b\right)}}}
\] |
pow3 [=>]50.7% | \[ \color{blue}{{\left(\sqrt[3]{\sqrt{\left(a + b\right) \cdot \left(a - b\right)}}\right)}^{3}}
\] |
pow1/3 [=>]47.6% | \[ {\color{blue}{\left({\left(\sqrt{\left(a + b\right) \cdot \left(a - b\right)}\right)}^{0.3333333333333333}\right)}}^{3}
\] |
pow1/2 [=>]47.6% | \[ {\left({\color{blue}{\left({\left(\left(a + b\right) \cdot \left(a - b\right)\right)}^{0.5}\right)}}^{0.3333333333333333}\right)}^{3}
\] |
difference-of-squares [<=]47.1% | \[ {\left({\left({\color{blue}{\left(a \cdot a - b \cdot b\right)}}^{0.5}\right)}^{0.3333333333333333}\right)}^{3}
\] |
pow-pow [=>]47.1% | \[ {\color{blue}{\left({\left(a \cdot a - b \cdot b\right)}^{\left(0.5 \cdot 0.3333333333333333\right)}\right)}}^{3}
\] |
fma-neg [=>]47.6% | \[ {\left({\color{blue}{\left(\mathsf{fma}\left(a, a, -b \cdot b\right)\right)}}^{\left(0.5 \cdot 0.3333333333333333\right)}\right)}^{3}
\] |
metadata-eval [=>]47.6% | \[ {\left({\left(\mathsf{fma}\left(a, a, -b \cdot b\right)\right)}^{\color{blue}{0.16666666666666666}}\right)}^{3}
\] |
Taylor expanded in a around -inf 93.8%
Simplified100.0%
[Start]93.8% | \[ 0.16666666666666666 \cdot \left({1}^{0.3333333333333333} \cdot \frac{{b}^{2}}{a}\right) + \left(0.3333333333333333 \cdot \frac{{b}^{2}}{a} + -1 \cdot a\right)
\] |
|---|---|
associate-+r+ [=>]93.8% | \[ \color{blue}{\left(0.16666666666666666 \cdot \left({1}^{0.3333333333333333} \cdot \frac{{b}^{2}}{a}\right) + 0.3333333333333333 \cdot \frac{{b}^{2}}{a}\right) + -1 \cdot a}
\] |
neg-mul-1 [<=]93.8% | \[ \left(0.16666666666666666 \cdot \left({1}^{0.3333333333333333} \cdot \frac{{b}^{2}}{a}\right) + 0.3333333333333333 \cdot \frac{{b}^{2}}{a}\right) + \color{blue}{\left(-a\right)}
\] |
unsub-neg [=>]93.8% | \[ \color{blue}{\left(0.16666666666666666 \cdot \left({1}^{0.3333333333333333} \cdot \frac{{b}^{2}}{a}\right) + 0.3333333333333333 \cdot \frac{{b}^{2}}{a}\right) - a}
\] |
pow-base-1 [=>]93.8% | \[ \left(0.16666666666666666 \cdot \left(\color{blue}{1} \cdot \frac{{b}^{2}}{a}\right) + 0.3333333333333333 \cdot \frac{{b}^{2}}{a}\right) - a
\] |
associate-*r* [=>]93.8% | \[ \left(\color{blue}{\left(0.16666666666666666 \cdot 1\right) \cdot \frac{{b}^{2}}{a}} + 0.3333333333333333 \cdot \frac{{b}^{2}}{a}\right) - a
\] |
metadata-eval [=>]93.8% | \[ \left(\color{blue}{0.16666666666666666} \cdot \frac{{b}^{2}}{a} + 0.3333333333333333 \cdot \frac{{b}^{2}}{a}\right) - a
\] |
unpow2 [=>]93.8% | \[ \left(0.16666666666666666 \cdot \frac{\color{blue}{b \cdot b}}{a} + 0.3333333333333333 \cdot \frac{{b}^{2}}{a}\right) - a
\] |
unpow2 [=>]93.8% | \[ \left(0.16666666666666666 \cdot \frac{b \cdot b}{a} + 0.3333333333333333 \cdot \frac{\color{blue}{b \cdot b}}{a}\right) - a
\] |
distribute-rgt-out [=>]93.8% | \[ \color{blue}{\frac{b \cdot b}{a} \cdot \left(0.16666666666666666 + 0.3333333333333333\right)} - a
\] |
associate-*r/ [<=]100.0% | \[ \color{blue}{\left(b \cdot \frac{b}{a}\right)} \cdot \left(0.16666666666666666 + 0.3333333333333333\right) - a
\] |
metadata-eval [=>]100.0% | \[ \left(b \cdot \frac{b}{a}\right) \cdot \color{blue}{0.5} - a
\] |
if -1.00000000000000007e-285 < a Initial program 46.9%
Simplified47.2%
[Start]46.9% | \[ \sqrt{a \cdot a - b \cdot b}
\] |
|---|---|
difference-of-squares [=>]47.2% | \[ \sqrt{\color{blue}{\left(a + b\right) \cdot \left(a - b\right)}}
\] |
Taylor expanded in a around inf 95.7%
Simplified99.7%
[Start]95.7% | \[ 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 [=>]95.7% | \[ \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 [=>]95.7% | \[ \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 [=>]95.7% | \[ \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 [=>]95.7% | \[ \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 [=>]95.7% | \[ \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 [=>]95.7% | \[ \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 [=>]95.7% | \[ \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.8%
| Alternative 1 | |
|---|---|
| Accuracy | 99.4% |
| Cost | 6980 |
| Alternative 2 | |
|---|---|
| Accuracy | 99.1% |
| Cost | 708 |
| Alternative 3 | |
|---|---|
| Accuracy | 98.8% |
| Cost | 260 |
| Alternative 4 | |
|---|---|
| Accuracy | 49.7% |
| Cost | 64 |
herbie shell --seed 2023167
(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))))