| Alternative 1 | |
|---|---|
| Accuracy | 98.7% |
| Cost | 6980 |
\[\begin{array}{l}
\mathbf{if}\;a \leq -2 \cdot 10^{-230}:\\
\;\;\;\;-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 (let* ((t_0 (/ b (/ a b)))) (if (<= a -2e-230) (fma 0.5 t_0 (- a)) (fma -0.5 t_0 a))))
double code(double a, double b) {
return sqrt(((a * a) - (b * b)));
}
double code(double a, double b) {
double t_0 = b / (a / b);
double tmp;
if (a <= -2e-230) {
tmp = fma(0.5, t_0, -a);
} else {
tmp = fma(-0.5, t_0, a);
}
return tmp;
}
function code(a, b) return sqrt(Float64(Float64(a * a) - Float64(b * b))) end
function code(a, b) t_0 = Float64(b / Float64(a / b)) tmp = 0.0 if (a <= -2e-230) tmp = fma(0.5, t_0, Float64(-a)); else tmp = fma(-0.5, t_0, a); end return tmp end
code[a_, b_] := N[Sqrt[N[(N[(a * a), $MachinePrecision] - N[(b * b), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
code[a_, b_] := Block[{t$95$0 = N[(b / N[(a / b), $MachinePrecision]), $MachinePrecision]}, If[LessEqual[a, -2e-230], N[(0.5 * t$95$0 + (-a)), $MachinePrecision], N[(-0.5 * t$95$0 + a), $MachinePrecision]]]
\sqrt{a \cdot a - b \cdot b}
\begin{array}{l}
t_0 := \frac{b}{\frac{a}{b}}\\
\mathbf{if}\;a \leq -2 \cdot 10^{-230}:\\
\;\;\;\;\mathsf{fma}\left(0.5, t_0, -a\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(-0.5, t_0, a\right)\\
\end{array}
Herbie found 4 alternatives:
| Alternative | Accuracy | Speedup |
|---|
| Original | 54.4% |
|---|---|
| Target | 99.2% |
| Herbie | 98.9% |
if a < -2.00000000000000009e-230Initial program 52.2%
Simplified52.9%
[Start]52.2 | \[ \sqrt{a \cdot a - b \cdot b}
\] |
|---|---|
difference-of-squares [=>]52.9 | \[ \sqrt{\color{blue}{\left(a + b\right) \cdot \left(a - b\right)}}
\] |
Applied egg-rr48.6%
[Start]52.9 | \[ \sqrt{\left(a + b\right) \cdot \left(a - b\right)}
\] |
|---|---|
pow1/2 [=>]52.9 | \[ \color{blue}{{\left(\left(a + b\right) \cdot \left(a - b\right)\right)}^{0.5}}
\] |
pow-to-exp [=>]49.3 | \[ \color{blue}{e^{\log \left(\left(a + b\right) \cdot \left(a - b\right)\right) \cdot 0.5}}
\] |
difference-of-squares [<=]48.6 | \[ e^{\log \color{blue}{\left(a \cdot a - b \cdot b\right)} \cdot 0.5}
\] |
fma-neg [=>]48.6 | \[ e^{\log \color{blue}{\left(\mathsf{fma}\left(a, a, -b \cdot b\right)\right)} \cdot 0.5}
\] |
Taylor expanded in a around -inf 91.0%
Simplified99.2%
[Start]91.0 | \[ 0.5 \cdot \frac{{b}^{2}}{a} + -1 \cdot a
\] |
|---|---|
fma-def [=>]91.0 | \[ \color{blue}{\mathsf{fma}\left(0.5, \frac{{b}^{2}}{a}, -1 \cdot a\right)}
\] |
unpow2 [=>]91.0 | \[ \mathsf{fma}\left(0.5, \frac{\color{blue}{b \cdot b}}{a}, -1 \cdot a\right)
\] |
associate-/l* [=>]99.2 | \[ \mathsf{fma}\left(0.5, \color{blue}{\frac{b}{\frac{a}{b}}}, -1 \cdot a\right)
\] |
mul-1-neg [=>]99.2 | \[ \mathsf{fma}\left(0.5, \frac{b}{\frac{a}{b}}, \color{blue}{-a}\right)
\] |
if -2.00000000000000009e-230 < a Initial program 54.2%
Simplified54.8%
[Start]54.2 | \[ \sqrt{a \cdot a - b \cdot b}
\] |
|---|---|
difference-of-squares [=>]54.8 | \[ \sqrt{\color{blue}{\left(a + b\right) \cdot \left(a - b\right)}}
\] |
Taylor expanded in a around inf 93.7%
Simplified100.0%
[Start]93.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 [=>]93.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 [=>]93.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 [=>]93.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 [=>]93.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 [=>]93.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 [=>]93.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 [=>]93.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.6%
| Alternative 1 | |
|---|---|
| Accuracy | 98.7% |
| Cost | 6980 |
| Alternative 2 | |
|---|---|
| Accuracy | 98.3% |
| Cost | 260 |
| Alternative 3 | |
|---|---|
| Accuracy | 49.9% |
| Cost | 64 |
herbie shell --seed 2023164
(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))))