(FPCore (lo hi x) :precision binary64 (/ (- x lo) (- hi lo)))
(FPCore (lo hi x) :precision binary64 (+ (/ x hi) (- (fma (/ x hi) (* (/ lo hi) (/ lo hi)) (* (/ lo hi) (- -1.0 (/ lo hi)))) (pow (/ lo hi) 3.0))))
double code(double lo, double hi, double x) {
return (x - lo) / (hi - lo);
}
double code(double lo, double hi, double x) {
return (x / hi) + (fma((x / hi), ((lo / hi) * (lo / hi)), ((lo / hi) * (-1.0 - (lo / hi)))) - pow((lo / hi), 3.0));
}
function code(lo, hi, x) return Float64(Float64(x - lo) / Float64(hi - lo)) end
function code(lo, hi, x) return Float64(Float64(x / hi) + Float64(fma(Float64(x / hi), Float64(Float64(lo / hi) * Float64(lo / hi)), Float64(Float64(lo / hi) * Float64(-1.0 - Float64(lo / hi)))) - (Float64(lo / hi) ^ 3.0))) end
code[lo_, hi_, x_] := N[(N[(x - lo), $MachinePrecision] / N[(hi - lo), $MachinePrecision]), $MachinePrecision]
code[lo_, hi_, x_] := N[(N[(x / hi), $MachinePrecision] + N[(N[(N[(x / hi), $MachinePrecision] * N[(N[(lo / hi), $MachinePrecision] * N[(lo / hi), $MachinePrecision]), $MachinePrecision] + N[(N[(lo / hi), $MachinePrecision] * N[(-1.0 - N[(lo / hi), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] - N[Power[N[(lo / hi), $MachinePrecision], 3.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\frac{x - lo}{hi - lo}
\frac{x}{hi} + \left(\mathsf{fma}\left(\frac{x}{hi}, \frac{lo}{hi} \cdot \frac{lo}{hi}, \frac{lo}{hi} \cdot \left(-1 - \frac{lo}{hi}\right)\right) - {\left(\frac{lo}{hi}\right)}^{3}\right)



Bits error versus lo



Bits error versus hi



Bits error versus x
Initial program 62.0
Taylor expanded in hi around inf 64.0
Simplified51.9
Taylor expanded in lo around inf 51.9
Final simplification51.9
herbie shell --seed 2022137
(FPCore (lo hi x)
:name "(/ (- x lo) (- hi lo))"
:precision binary64
:pre (and (< lo -1e+308) (> hi 1e+308))
(/ (- x lo) (- hi lo)))