| Alternative 1 | |
|---|---|
| Error | 9.4 |
| Cost | 6788 |
\[\begin{array}{l}
\mathbf{if}\;x \leq 3.8 \cdot 10^{-81}:\\
\;\;\;\;x - \sqrt{-\varepsilon}\\
\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 (let* ((t_0 (- x (sqrt (- (* x x) eps))))) (if (<= t_0 -2e-151) t_0 (* 0.5 (/ eps x)))))
double code(double x, double eps) {
return x - sqrt(((x * x) - eps));
}
double code(double x, double eps) {
double t_0 = x - sqrt(((x * x) - eps));
double tmp;
if (t_0 <= -2e-151) {
tmp = t_0;
} else {
tmp = 0.5 * (eps / x);
}
return tmp;
}
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
real(8) :: t_0
real(8) :: tmp
t_0 = x - sqrt(((x * x) - eps))
if (t_0 <= (-2d-151)) then
tmp = t_0
else
tmp = 0.5d0 * (eps / x)
end if
code = tmp
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) {
double t_0 = x - Math.sqrt(((x * x) - eps));
double tmp;
if (t_0 <= -2e-151) {
tmp = t_0;
} else {
tmp = 0.5 * (eps / x);
}
return tmp;
}
def code(x, eps): return x - math.sqrt(((x * x) - eps))
def code(x, eps): t_0 = x - math.sqrt(((x * x) - eps)) tmp = 0 if t_0 <= -2e-151: tmp = t_0 else: tmp = 0.5 * (eps / x) return tmp
function code(x, eps) return Float64(x - sqrt(Float64(Float64(x * x) - eps))) end
function code(x, eps) t_0 = Float64(x - sqrt(Float64(Float64(x * x) - eps))) tmp = 0.0 if (t_0 <= -2e-151) tmp = t_0; else tmp = Float64(0.5 * Float64(eps / x)); end return tmp end
function tmp = code(x, eps) tmp = x - sqrt(((x * x) - eps)); end
function tmp_2 = code(x, eps) t_0 = x - sqrt(((x * x) - eps)); tmp = 0.0; if (t_0 <= -2e-151) tmp = t_0; else tmp = 0.5 * (eps / x); end tmp_2 = tmp; end
code[x_, eps_] := N[(x - N[Sqrt[N[(N[(x * x), $MachinePrecision] - eps), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
code[x_, eps_] := Block[{t$95$0 = N[(x - N[Sqrt[N[(N[(x * x), $MachinePrecision] - eps), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]}, If[LessEqual[t$95$0, -2e-151], t$95$0, N[(0.5 * N[(eps / x), $MachinePrecision]), $MachinePrecision]]]
x - \sqrt{x \cdot x - \varepsilon}
\begin{array}{l}
t_0 := x - \sqrt{x \cdot x - \varepsilon}\\
\mathbf{if}\;t_0 \leq -2 \cdot 10^{-151}:\\
\;\;\;\;t_0\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \frac{\varepsilon}{x}\\
\end{array}
Results
| Original | 24.7 |
|---|---|
| Target | 0.3 |
| Herbie | 1.5 |
if (-.f64 x (sqrt.f64 (-.f64 (*.f64 x x) eps))) < -1.9999999999999999e-151Initial program 0.9
if -1.9999999999999999e-151 < (-.f64 x (sqrt.f64 (-.f64 (*.f64 x x) eps))) Initial program 57.9
Taylor expanded in x around inf 2.3
Final simplification1.5
| Alternative 1 | |
|---|---|
| Error | 9.4 |
| Cost | 6788 |
| Alternative 2 | |
|---|---|
| Error | 35.3 |
| Cost | 320 |
| Alternative 3 | |
|---|---|
| Error | 61.2 |
| Cost | 192 |
| Alternative 4 | |
|---|---|
| Error | 61.7 |
| Cost | 64 |
herbie shell --seed 2023090
(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))))