| Alternative 1 | |
|---|---|
| Error | 1.12% |
| Cost | 7044 |
\[\begin{array}{l}
\mathbf{if}\;a \leq -5 \cdot 10^{-236}:\\
\;\;\;\;\mathsf{fma}\left(0.5, \frac{b}{\frac{a}{b}}, -a\right)\\
\mathbf{else}:\\
\;\;\;\;a + \frac{b \cdot -0.5}{\frac{a}{b}}\\
\end{array}
\]
(FPCore (a b) :precision binary64 (sqrt (- (* a a) (* b b))))
(FPCore (a b) :precision binary64 (if (<= a -5e-236) (fma 0.5 (/ b (/ a b)) (- a)) (/ (- a b) (sqrt (/ (- a b) (+ a b))))))
double code(double a, double b) {
return sqrt(((a * a) - (b * b)));
}
double code(double a, double b) {
double tmp;
if (a <= -5e-236) {
tmp = fma(0.5, (b / (a / b)), -a);
} else {
tmp = (a - b) / sqrt(((a - b) / (a + b)));
}
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-236) tmp = fma(0.5, Float64(b / Float64(a / b)), Float64(-a)); else tmp = Float64(Float64(a - b) / sqrt(Float64(Float64(a - b) / Float64(a + b)))); 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-236], N[(0.5 * N[(b / N[(a / b), $MachinePrecision]), $MachinePrecision] + (-a)), $MachinePrecision], N[(N[(a - b), $MachinePrecision] / N[Sqrt[N[(N[(a - b), $MachinePrecision] / N[(a + b), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]
\sqrt{a \cdot a - b \cdot b}
\begin{array}{l}
\mathbf{if}\;a \leq -5 \cdot 10^{-236}:\\
\;\;\;\;\mathsf{fma}\left(0.5, \frac{b}{\frac{a}{b}}, -a\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{a - b}{\sqrt{\frac{a - b}{a + b}}}\\
\end{array}
| Original | 49.87% |
|---|---|
| Target | 0.77% |
| Herbie | 0.95% |
if a < -4.9999999999999998e-236Initial program 48.92
Taylor expanded in a around -inf 6.82
Simplified0.39
[Start]6.82 | \[ 0.5 \cdot \frac{{b}^{2}}{a} + -1 \cdot a
\] |
|---|---|
fma-def [=>]6.82 | \[ \color{blue}{\mathsf{fma}\left(0.5, \frac{{b}^{2}}{a}, -1 \cdot a\right)}
\] |
unpow2 [=>]6.82 | \[ \mathsf{fma}\left(0.5, \frac{\color{blue}{b \cdot b}}{a}, -1 \cdot a\right)
\] |
associate-/l* [=>]0.39 | \[ \mathsf{fma}\left(0.5, \color{blue}{\frac{b}{\frac{a}{b}}}, -1 \cdot a\right)
\] |
mul-1-neg [=>]0.39 | \[ \mathsf{fma}\left(0.5, \frac{b}{\frac{a}{b}}, \color{blue}{-a}\right)
\] |
if -4.9999999999999998e-236 < a Initial program 50.81
Applied egg-rr2.33
Applied egg-rr34.99
Simplified1.6
[Start]34.99 | \[ \frac{\left(a - b\right) \cdot \sqrt{a + b}}{\sqrt{a - b}}
\] |
|---|---|
associate-/l* [=>]1.6 | \[ \color{blue}{\frac{a - b}{\frac{\sqrt{a - b}}{\sqrt{a + b}}}}
\] |
+-commutative [=>]1.6 | \[ \frac{a - b}{\frac{\sqrt{a - b}}{\sqrt{\color{blue}{b + a}}}}
\] |
Applied egg-rr1.52
Simplified1.5
[Start]1.52 | \[ \frac{a - b}{e^{\mathsf{log1p}\left(\sqrt{\frac{a - b}{a + b}}\right)} - 1}
\] |
|---|---|
expm1-def [=>]1.51 | \[ \frac{a - b}{\color{blue}{\mathsf{expm1}\left(\mathsf{log1p}\left(\sqrt{\frac{a - b}{a + b}}\right)\right)}}
\] |
expm1-log1p [=>]1.5 | \[ \frac{a - b}{\color{blue}{\sqrt{\frac{a - b}{a + b}}}}
\] |
Final simplification0.95
| Alternative 1 | |
|---|---|
| Error | 1.12% |
| Cost | 7044 |
| Alternative 2 | |
|---|---|
| Error | 1.36% |
| Cost | 708 |
| Alternative 3 | |
|---|---|
| Error | 1.61% |
| Cost | 260 |
| Alternative 4 | |
|---|---|
| Error | 50.44% |
| Cost | 64 |
herbie shell --seed 2023121
(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))))