| Alternative 1 | |
|---|---|
| Error | 1.5 |
| Cost | 13764 |
\[\begin{array}{l}
t_0 := x - \sqrt{x \cdot x - \varepsilon}\\
\mathbf{if}\;t_0 \leq -5 \cdot 10^{-151}:\\
\;\;\;\;t_0\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \frac{\varepsilon}{x}\\
\end{array}
\]
(FPCore (x eps) :precision binary64 (- x (sqrt (- (* x x) eps))))
(FPCore (x eps) :precision binary64 (/ eps (+ x (sqrt (- (* x x) eps)))))
double code(double x, double eps) {
return x - sqrt(((x * x) - eps));
}
double code(double x, double eps) {
return eps / (x + sqrt(((x * x) - eps)));
}
real(8) function code(x, eps)
real(8), intent (in) :: x
real(8), intent (in) :: eps
code = x - sqrt(((x * x) - eps))
end function
real(8) function code(x, eps)
real(8), intent (in) :: x
real(8), intent (in) :: eps
code = eps / (x + sqrt(((x * x) - eps)))
end function
public static double code(double x, double eps) {
return x - Math.sqrt(((x * x) - eps));
}
public static double code(double x, double eps) {
return eps / (x + Math.sqrt(((x * x) - eps)));
}
def code(x, eps): return x - math.sqrt(((x * x) - eps))
def code(x, eps): return eps / (x + math.sqrt(((x * x) - eps)))
function code(x, eps) return Float64(x - sqrt(Float64(Float64(x * x) - eps))) end
function code(x, eps) return Float64(eps / Float64(x + sqrt(Float64(Float64(x * x) - eps)))) end
function tmp = code(x, eps) tmp = x - sqrt(((x * x) - eps)); end
function tmp = code(x, eps) tmp = eps / (x + sqrt(((x * x) - eps))); end
code[x_, eps_] := N[(x - N[Sqrt[N[(N[(x * x), $MachinePrecision] - eps), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
code[x_, eps_] := N[(eps / N[(x + N[Sqrt[N[(N[(x * x), $MachinePrecision] - eps), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
x - \sqrt{x \cdot x - \varepsilon}
\frac{\varepsilon}{x + \sqrt{x \cdot x - \varepsilon}}
Results
| Original | 24.6 |
|---|---|
| Target | 0.3 |
| Herbie | 0.3 |
Initial program 24.6
Applied egg-rr0.4
Simplified0.3
[Start]0.4 | \[ \left(\varepsilon + x \cdot \left(x - x\right)\right) \cdot \frac{1}{x + \sqrt{x \cdot x - \varepsilon}}
\] |
|---|---|
*-commutative [=>]0.4 | \[ \color{blue}{\frac{1}{x + \sqrt{x \cdot x - \varepsilon}} \cdot \left(\varepsilon + x \cdot \left(x - x\right)\right)}
\] |
associate-*l/ [=>]0.3 | \[ \color{blue}{\frac{1 \cdot \left(\varepsilon + x \cdot \left(x - x\right)\right)}{x + \sqrt{x \cdot x - \varepsilon}}}
\] |
*-lft-identity [=>]0.3 | \[ \frac{\color{blue}{\varepsilon + x \cdot \left(x - x\right)}}{x + \sqrt{x \cdot x - \varepsilon}}
\] |
+-inverses [=>]0.3 | \[ \frac{\varepsilon + x \cdot \color{blue}{0}}{x + \sqrt{x \cdot x - \varepsilon}}
\] |
mul0-rgt [=>]0.3 | \[ \frac{\varepsilon + \color{blue}{0}}{x + \sqrt{x \cdot x - \varepsilon}}
\] |
Applied egg-rr58.2
Simplified0.3
[Start]58.2 | \[ e^{\mathsf{log1p}\left(\frac{\varepsilon}{x + \sqrt{x \cdot x - \varepsilon}}\right)} - 1
\] |
|---|---|
expm1-def [=>]0.3 | \[ \color{blue}{\mathsf{expm1}\left(\mathsf{log1p}\left(\frac{\varepsilon}{x + \sqrt{x \cdot x - \varepsilon}}\right)\right)}
\] |
expm1-log1p [=>]0.3 | \[ \color{blue}{\frac{\varepsilon}{x + \sqrt{x \cdot x - \varepsilon}}}
\] |
Final simplification0.3
| Alternative 1 | |
|---|---|
| Error | 1.5 |
| Cost | 13764 |
| Alternative 2 | |
|---|---|
| Error | 9.3 |
| Cost | 7053 |
| Alternative 3 | |
|---|---|
| Error | 9.1 |
| Cost | 7053 |
| Alternative 4 | |
|---|---|
| Error | 35.4 |
| Cost | 320 |
| Alternative 5 | |
|---|---|
| Error | 56.7 |
| Cost | 192 |
| Alternative 6 | |
|---|---|
| Error | 61.7 |
| Cost | 64 |
herbie shell --seed 2023057
(FPCore (x eps)
:name "ENA, Section 1.4, Exercise 4d"
:precision binary64
:pre (and (and (<= 0.0 x) (<= x 1000000000.0)) (and (<= -1.0 eps) (<= eps 1.0)))
:herbie-target
(/ eps (+ x (sqrt (- (* x x) eps))))
(- x (sqrt (- (* x x) eps))))