| Alternative 1 | |
|---|---|
| Accuracy | 99.2% |
| Cost | 6980 |
\[\begin{array}{l}
\mathbf{if}\;a \leq -1 \cdot 10^{-285}:\\
\;\;\;\;-a\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(-0.5, \frac{b}{\frac{a}{b}}, a\right)\\
\end{array}
\]

(FPCore (a b) :precision binary64 (sqrt (- (* a a) (* b b))))
(FPCore (a b) :precision binary64 (if (<= a -1e-285) (- 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 = -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(-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], (-a), 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 -1 \cdot 10^{-285}:\\
\;\;\;\;-a\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(-0.5, \frac{b}{\frac{a}{b}}, a\right)\\
\end{array}
Herbie found 3 alternatives:
| Alternative | Accuracy | Speedup |
|---|
| Original | 52.8% |
|---|---|
| Target | 99.2% |
| Herbie | 99.2% |
if a < -1.00000000000000007e-285Initial program 61.0%
Simplified61.4%
[Start]61.0% | \[ \sqrt{a \cdot a - b \cdot b}
\] |
|---|---|
difference-of-squares [=>]61.4% | \[ \sqrt{\color{blue}{\left(a + b\right) \cdot \left(a - b\right)}}
\] |
Taylor expanded in a around inf 60.2%
Simplified60.2%
[Start]60.2% | \[ \sqrt{{a}^{2}}
\] |
|---|---|
unpow2 [=>]60.2% | \[ \sqrt{\color{blue}{a \cdot a}}
\] |
Taylor expanded in a around -inf 98.5%
if -1.00000000000000007e-285 < a Initial program 51.5%
Simplified52.3%
[Start]51.5% | \[ \sqrt{a \cdot a - b \cdot b}
\] |
|---|---|
difference-of-squares [=>]52.3% | \[ \sqrt{\color{blue}{\left(a + b\right) \cdot \left(a - b\right)}}
\] |
Taylor expanded in a around -inf 0.0%
Simplified99.2%
[Start]0.0% | \[ 0.5 \cdot \left(b + -1 \cdot b\right) + \left(-0.5 \cdot \frac{{b}^{2} - {\left(0.5 \cdot \frac{b + -1 \cdot b}{\sqrt{-1}}\right)}^{2}}{a} + -1 \cdot \left({\left(\sqrt{-1}\right)}^{2} \cdot a\right)\right)
\] |
|---|---|
fma-def [=>]0.0% | \[ \color{blue}{\mathsf{fma}\left(0.5, b + -1 \cdot b, -0.5 \cdot \frac{{b}^{2} - {\left(0.5 \cdot \frac{b + -1 \cdot b}{\sqrt{-1}}\right)}^{2}}{a} + -1 \cdot \left({\left(\sqrt{-1}\right)}^{2} \cdot a\right)\right)}
\] |
distribute-rgt1-in [=>]0.0% | \[ \mathsf{fma}\left(0.5, \color{blue}{\left(-1 + 1\right) \cdot b}, -0.5 \cdot \frac{{b}^{2} - {\left(0.5 \cdot \frac{b + -1 \cdot b}{\sqrt{-1}}\right)}^{2}}{a} + -1 \cdot \left({\left(\sqrt{-1}\right)}^{2} \cdot a\right)\right)
\] |
metadata-eval [=>]0.0% | \[ \mathsf{fma}\left(0.5, \color{blue}{0} \cdot b, -0.5 \cdot \frac{{b}^{2} - {\left(0.5 \cdot \frac{b + -1 \cdot b}{\sqrt{-1}}\right)}^{2}}{a} + -1 \cdot \left({\left(\sqrt{-1}\right)}^{2} \cdot a\right)\right)
\] |
mul0-lft [=>]0.0% | \[ \mathsf{fma}\left(0.5, \color{blue}{0}, -0.5 \cdot \frac{{b}^{2} - {\left(0.5 \cdot \frac{b + -1 \cdot b}{\sqrt{-1}}\right)}^{2}}{a} + -1 \cdot \left({\left(\sqrt{-1}\right)}^{2} \cdot a\right)\right)
\] |
fma-udef [=>]0.0% | \[ \color{blue}{0.5 \cdot 0 + \left(-0.5 \cdot \frac{{b}^{2} - {\left(0.5 \cdot \frac{b + -1 \cdot b}{\sqrt{-1}}\right)}^{2}}{a} + -1 \cdot \left({\left(\sqrt{-1}\right)}^{2} \cdot a\right)\right)}
\] |
metadata-eval [=>]0.0% | \[ \color{blue}{0} + \left(-0.5 \cdot \frac{{b}^{2} - {\left(0.5 \cdot \frac{b + -1 \cdot b}{\sqrt{-1}}\right)}^{2}}{a} + -1 \cdot \left({\left(\sqrt{-1}\right)}^{2} \cdot a\right)\right)
\] |
+-lft-identity [=>]0.0% | \[ \color{blue}{-0.5 \cdot \frac{{b}^{2} - {\left(0.5 \cdot \frac{b + -1 \cdot b}{\sqrt{-1}}\right)}^{2}}{a} + -1 \cdot \left({\left(\sqrt{-1}\right)}^{2} \cdot a\right)}
\] |
Final simplification98.8%
| Alternative 1 | |
|---|---|
| Accuracy | 99.2% |
| Cost | 6980 |
| Alternative 2 | |
|---|---|
| Accuracy | 98.9% |
| Cost | 260 |
| Alternative 3 | |
|---|---|
| Accuracy | 50.8% |
| Cost | 64 |
herbie shell --seed 2023263
(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))))