| Alternative 1 | |
|---|---|
| Error | 51.6 |
| Cost | 448 |
\[\frac{hi}{lo} \cdot \frac{hi}{lo}
\]
(FPCore (lo hi x) :precision binary64 (/ (- x lo) (- hi lo)))
(FPCore (lo hi x)
:precision binary64
(let* ((t_0 (/ (- x hi) lo))
(t_1 (+ 1.0 (pow (* (- -1.0 (/ hi lo)) t_0) 3.0)))
(t_2 (+ 1.0 (* t_0 (+ 1.0 (/ hi lo))))))
(if (<= x -8.565711362251411e+111)
(/ t_1 (+ (+ -1.0 (+ 1.0 (pow t_0 2.0))) t_2))
(if (<= x 1.687909615090524e+79)
(/
(- 1.0 (/ (pow x 3.0) (pow lo 3.0)))
(+ t_2 (pow (/ (- hi x) lo) 2.0)))
(/ t_1 (+ t_2 (* (/ hi lo) (/ hi lo))))))))double code(double lo, double hi, double x) {
return (x - lo) / (hi - lo);
}
double code(double lo, double hi, double x) {
double t_0 = (x - hi) / lo;
double t_1 = 1.0 + pow(((-1.0 - (hi / lo)) * t_0), 3.0);
double t_2 = 1.0 + (t_0 * (1.0 + (hi / lo)));
double tmp;
if (x <= -8.565711362251411e+111) {
tmp = t_1 / ((-1.0 + (1.0 + pow(t_0, 2.0))) + t_2);
} else if (x <= 1.687909615090524e+79) {
tmp = (1.0 - (pow(x, 3.0) / pow(lo, 3.0))) / (t_2 + pow(((hi - x) / lo), 2.0));
} else {
tmp = t_1 / (t_2 + ((hi / lo) * (hi / lo)));
}
return tmp;
}
real(8) function code(lo, hi, x)
real(8), intent (in) :: lo
real(8), intent (in) :: hi
real(8), intent (in) :: x
code = (x - lo) / (hi - lo)
end function
real(8) function code(lo, hi, x)
real(8), intent (in) :: lo
real(8), intent (in) :: hi
real(8), intent (in) :: x
real(8) :: t_0
real(8) :: t_1
real(8) :: t_2
real(8) :: tmp
t_0 = (x - hi) / lo
t_1 = 1.0d0 + ((((-1.0d0) - (hi / lo)) * t_0) ** 3.0d0)
t_2 = 1.0d0 + (t_0 * (1.0d0 + (hi / lo)))
if (x <= (-8.565711362251411d+111)) then
tmp = t_1 / (((-1.0d0) + (1.0d0 + (t_0 ** 2.0d0))) + t_2)
else if (x <= 1.687909615090524d+79) then
tmp = (1.0d0 - ((x ** 3.0d0) / (lo ** 3.0d0))) / (t_2 + (((hi - x) / lo) ** 2.0d0))
else
tmp = t_1 / (t_2 + ((hi / lo) * (hi / lo)))
end if
code = tmp
end function
public static double code(double lo, double hi, double x) {
return (x - lo) / (hi - lo);
}
public static double code(double lo, double hi, double x) {
double t_0 = (x - hi) / lo;
double t_1 = 1.0 + Math.pow(((-1.0 - (hi / lo)) * t_0), 3.0);
double t_2 = 1.0 + (t_0 * (1.0 + (hi / lo)));
double tmp;
if (x <= -8.565711362251411e+111) {
tmp = t_1 / ((-1.0 + (1.0 + Math.pow(t_0, 2.0))) + t_2);
} else if (x <= 1.687909615090524e+79) {
tmp = (1.0 - (Math.pow(x, 3.0) / Math.pow(lo, 3.0))) / (t_2 + Math.pow(((hi - x) / lo), 2.0));
} else {
tmp = t_1 / (t_2 + ((hi / lo) * (hi / lo)));
}
return tmp;
}
def code(lo, hi, x): return (x - lo) / (hi - lo)
def code(lo, hi, x): t_0 = (x - hi) / lo t_1 = 1.0 + math.pow(((-1.0 - (hi / lo)) * t_0), 3.0) t_2 = 1.0 + (t_0 * (1.0 + (hi / lo))) tmp = 0 if x <= -8.565711362251411e+111: tmp = t_1 / ((-1.0 + (1.0 + math.pow(t_0, 2.0))) + t_2) elif x <= 1.687909615090524e+79: tmp = (1.0 - (math.pow(x, 3.0) / math.pow(lo, 3.0))) / (t_2 + math.pow(((hi - x) / lo), 2.0)) else: tmp = t_1 / (t_2 + ((hi / lo) * (hi / lo))) return tmp
function code(lo, hi, x) return Float64(Float64(x - lo) / Float64(hi - lo)) end
function code(lo, hi, x) t_0 = Float64(Float64(x - hi) / lo) t_1 = Float64(1.0 + (Float64(Float64(-1.0 - Float64(hi / lo)) * t_0) ^ 3.0)) t_2 = Float64(1.0 + Float64(t_0 * Float64(1.0 + Float64(hi / lo)))) tmp = 0.0 if (x <= -8.565711362251411e+111) tmp = Float64(t_1 / Float64(Float64(-1.0 + Float64(1.0 + (t_0 ^ 2.0))) + t_2)); elseif (x <= 1.687909615090524e+79) tmp = Float64(Float64(1.0 - Float64((x ^ 3.0) / (lo ^ 3.0))) / Float64(t_2 + (Float64(Float64(hi - x) / lo) ^ 2.0))); else tmp = Float64(t_1 / Float64(t_2 + Float64(Float64(hi / lo) * Float64(hi / lo)))); end return tmp end
function tmp = code(lo, hi, x) tmp = (x - lo) / (hi - lo); end
function tmp_2 = code(lo, hi, x) t_0 = (x - hi) / lo; t_1 = 1.0 + (((-1.0 - (hi / lo)) * t_0) ^ 3.0); t_2 = 1.0 + (t_0 * (1.0 + (hi / lo))); tmp = 0.0; if (x <= -8.565711362251411e+111) tmp = t_1 / ((-1.0 + (1.0 + (t_0 ^ 2.0))) + t_2); elseif (x <= 1.687909615090524e+79) tmp = (1.0 - ((x ^ 3.0) / (lo ^ 3.0))) / (t_2 + (((hi - x) / lo) ^ 2.0)); else tmp = t_1 / (t_2 + ((hi / lo) * (hi / lo))); end tmp_2 = tmp; end
code[lo_, hi_, x_] := N[(N[(x - lo), $MachinePrecision] / N[(hi - lo), $MachinePrecision]), $MachinePrecision]
code[lo_, hi_, x_] := Block[{t$95$0 = N[(N[(x - hi), $MachinePrecision] / lo), $MachinePrecision]}, Block[{t$95$1 = N[(1.0 + N[Power[N[(N[(-1.0 - N[(hi / lo), $MachinePrecision]), $MachinePrecision] * t$95$0), $MachinePrecision], 3.0], $MachinePrecision]), $MachinePrecision]}, Block[{t$95$2 = N[(1.0 + N[(t$95$0 * N[(1.0 + N[(hi / lo), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, If[LessEqual[x, -8.565711362251411e+111], N[(t$95$1 / N[(N[(-1.0 + N[(1.0 + N[Power[t$95$0, 2.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + t$95$2), $MachinePrecision]), $MachinePrecision], If[LessEqual[x, 1.687909615090524e+79], N[(N[(1.0 - N[(N[Power[x, 3.0], $MachinePrecision] / N[Power[lo, 3.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(t$95$2 + N[Power[N[(N[(hi - x), $MachinePrecision] / lo), $MachinePrecision], 2.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(t$95$1 / N[(t$95$2 + N[(N[(hi / lo), $MachinePrecision] * N[(hi / lo), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]]]]
\frac{x - lo}{hi - lo}
\begin{array}{l}
t_0 := \frac{x - hi}{lo}\\
t_1 := 1 + {\left(\left(-1 - \frac{hi}{lo}\right) \cdot t_0\right)}^{3}\\
t_2 := 1 + t_0 \cdot \left(1 + \frac{hi}{lo}\right)\\
\mathbf{if}\;x \leq -8.565711362251411 \cdot 10^{+111}:\\
\;\;\;\;\frac{t_1}{\left(-1 + \left(1 + {t_0}^{2}\right)\right) + t_2}\\
\mathbf{elif}\;x \leq 1.687909615090524 \cdot 10^{+79}:\\
\;\;\;\;\frac{1 - \frac{{x}^{3}}{{lo}^{3}}}{t_2 + {\left(\frac{hi - x}{lo}\right)}^{2}}\\
\mathbf{else}:\\
\;\;\;\;\frac{t_1}{t_2 + \frac{hi}{lo} \cdot \frac{hi}{lo}}\\
\end{array}
Results
if x < -8.565711362251411e111Initial program 62.0
Taylor expanded in lo around inf 64.0
Simplified51.9
Applied egg-rr51.9
Taylor expanded in hi around 0 43.8
Applied egg-rr43.8
if -8.565711362251411e111 < x < 1.6879096150905239e79Initial program 62.0
Taylor expanded in lo around inf 64.0
Simplified51.9
Applied egg-rr51.9
Taylor expanded in hi around 0 43.7
Taylor expanded in hi around 0 0.9
Simplified0.9
if 1.6879096150905239e79 < x Initial program 62.0
Taylor expanded in lo around inf 64.0
Simplified51.9
Applied egg-rr51.9
Taylor expanded in hi around 0 43.6
Taylor expanded in x around 0 64.0
Simplified43.7
Final simplification15.5
| Alternative 1 | |
|---|---|
| Error | 51.6 |
| Cost | 448 |
| Alternative 2 | |
|---|---|
| Error | 52.0 |
| Cost | 256 |
| Alternative 3 | |
|---|---|
| Error | 52.1 |
| Cost | 64 |

herbie shell --seed 2022289
(FPCore (lo hi x)
:name "(/ (- x lo) (- hi lo))"
:precision binary64
:pre (and (< lo -1e+308) (> hi 1e+308))
(/ (- x lo) (- hi lo)))