Average Error: 62.0 → 52.0
Time: 5.8s
Precision: binary64
\[lo < -1 \cdot 10^{+308} \land hi > 10^{+308}\]
\[\frac{x - lo}{hi - lo} \]
\[\mathsf{fma}\left(\frac{x}{hi}, \frac{lo}{hi}, \mathsf{fma}\left(\frac{1}{\sqrt[3]{hi \cdot hi}}, \frac{x}{\sqrt[3]{hi}}, \left(-{\left(\sqrt[3]{\frac{lo}{hi}}\right)}^{2}\right) \cdot \left(\sqrt[3]{-1} \cdot e^{0.3333333333333333 \cdot \left(\log \left(\frac{1}{hi}\right) - \log \left(\frac{-1}{lo}\right)\right)}\right)\right)\right) \]
(FPCore (lo hi x) :precision binary64 (/ (- x lo) (- hi lo)))
(FPCore (lo hi x)
 :precision binary64
 (fma
  (/ x hi)
  (/ lo hi)
  (fma
   (/ 1.0 (cbrt (* hi hi)))
   (/ x (cbrt hi))
   (*
    (- (pow (cbrt (/ lo hi)) 2.0))
    (*
     (cbrt -1.0)
     (exp (* 0.3333333333333333 (- (log (/ 1.0 hi)) (log (/ -1.0 lo))))))))))
double code(double lo, double hi, double x) {
	return (x - lo) / (hi - lo);
}
double code(double lo, double hi, double x) {
	return fma((x / hi), (lo / hi), fma((1.0 / cbrt((hi * hi))), (x / cbrt(hi)), (-pow(cbrt((lo / hi)), 2.0) * (cbrt(-1.0) * exp((0.3333333333333333 * (log((1.0 / hi)) - log((-1.0 / lo)))))))));
}
function code(lo, hi, x)
	return Float64(Float64(x - lo) / Float64(hi - lo))
end
function code(lo, hi, x)
	return fma(Float64(x / hi), Float64(lo / hi), fma(Float64(1.0 / cbrt(Float64(hi * hi))), Float64(x / cbrt(hi)), Float64(Float64(-(cbrt(Float64(lo / hi)) ^ 2.0)) * Float64(cbrt(-1.0) * exp(Float64(0.3333333333333333 * Float64(log(Float64(1.0 / hi)) - log(Float64(-1.0 / lo)))))))))
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[(lo / hi), $MachinePrecision] + N[(N[(1.0 / N[Power[N[(hi * hi), $MachinePrecision], 1/3], $MachinePrecision]), $MachinePrecision] * N[(x / N[Power[hi, 1/3], $MachinePrecision]), $MachinePrecision] + N[((-N[Power[N[Power[N[(lo / hi), $MachinePrecision], 1/3], $MachinePrecision], 2.0], $MachinePrecision]) * N[(N[Power[-1.0, 1/3], $MachinePrecision] * N[Exp[N[(0.3333333333333333 * N[(N[Log[N[(1.0 / hi), $MachinePrecision]], $MachinePrecision] - N[Log[N[(-1.0 / lo), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\frac{x - lo}{hi - lo}
\mathsf{fma}\left(\frac{x}{hi}, \frac{lo}{hi}, \mathsf{fma}\left(\frac{1}{\sqrt[3]{hi \cdot hi}}, \frac{x}{\sqrt[3]{hi}}, \left(-{\left(\sqrt[3]{\frac{lo}{hi}}\right)}^{2}\right) \cdot \left(\sqrt[3]{-1} \cdot e^{0.3333333333333333 \cdot \left(\log \left(\frac{1}{hi}\right) - \log \left(\frac{-1}{lo}\right)\right)}\right)\right)\right)

Error

Bits error versus lo

Bits error versus hi

Bits error versus x

Derivation

  1. Initial program 62.0

    \[\frac{x - lo}{hi - lo} \]
  2. Taylor expanded in lo around 0 58.0

    \[\leadsto \color{blue}{\left(\frac{x}{hi} + \frac{lo \cdot x}{{hi}^{2}}\right) - \frac{lo}{hi}} \]
  3. Simplified52.0

    \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{x}{hi}, \frac{lo}{hi}, \frac{x - lo}{hi}\right)} \]
  4. Applied egg-rr52.0

    \[\leadsto \mathsf{fma}\left(\frac{x}{hi}, \frac{lo}{hi}, \color{blue}{\mathsf{fma}\left(\frac{1}{\sqrt[3]{hi \cdot hi}}, \frac{x}{\sqrt[3]{hi}}, \left(-{\left(\sqrt[3]{\frac{lo}{hi}}\right)}^{2}\right) \cdot \sqrt[3]{\frac{lo}{hi}}\right)}\right) \]
  5. Taylor expanded in lo around -inf 52.0

    \[\leadsto \mathsf{fma}\left(\frac{x}{hi}, \frac{lo}{hi}, \mathsf{fma}\left(\frac{1}{\sqrt[3]{hi \cdot hi}}, \frac{x}{\sqrt[3]{hi}}, \left(-{\left(\sqrt[3]{\frac{lo}{hi}}\right)}^{2}\right) \cdot \color{blue}{\left(\sqrt[3]{-1} \cdot e^{0.3333333333333333 \cdot \left(\log \left(\frac{1}{hi}\right) - \log \left(\frac{-1}{lo}\right)\right)}\right)}\right)\right) \]
  6. Final simplification52.0

    \[\leadsto \mathsf{fma}\left(\frac{x}{hi}, \frac{lo}{hi}, \mathsf{fma}\left(\frac{1}{\sqrt[3]{hi \cdot hi}}, \frac{x}{\sqrt[3]{hi}}, \left(-{\left(\sqrt[3]{\frac{lo}{hi}}\right)}^{2}\right) \cdot \left(\sqrt[3]{-1} \cdot e^{0.3333333333333333 \cdot \left(\log \left(\frac{1}{hi}\right) - \log \left(\frac{-1}{lo}\right)\right)}\right)\right)\right) \]

Reproduce

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