| Alternative 1 | |
|---|---|
| Accuracy | 18.8% |
| Cost | 576 |

(FPCore (lo hi x) :precision binary64 (/ (- x lo) (- hi lo)))
(FPCore (lo hi x) :precision binary64 (/ (- (* (/ lo hi) x) lo) hi))
double code(double lo, double hi, double x) {
return (x - lo) / (hi - lo);
}
double code(double lo, double hi, double x) {
return (((lo / hi) * x) - lo) / hi;
}
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
code = (((lo / hi) * x) - lo) / hi
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) {
return (((lo / hi) * x) - lo) / hi;
}
def code(lo, hi, x): return (x - lo) / (hi - lo)
def code(lo, hi, x): return (((lo / hi) * x) - lo) / hi
function code(lo, hi, x) return Float64(Float64(x - lo) / Float64(hi - lo)) end
function code(lo, hi, x) return Float64(Float64(Float64(Float64(lo / hi) * x) - lo) / hi) end
function tmp = code(lo, hi, x) tmp = (x - lo) / (hi - lo); end
function tmp = code(lo, hi, x) tmp = (((lo / hi) * x) - lo) / hi; end
code[lo_, hi_, x_] := N[(N[(x - lo), $MachinePrecision] / N[(hi - lo), $MachinePrecision]), $MachinePrecision]
code[lo_, hi_, x_] := N[(N[(N[(N[(lo / hi), $MachinePrecision] * x), $MachinePrecision] - lo), $MachinePrecision] / hi), $MachinePrecision]
\frac{x - lo}{hi - lo}
\begin{array}{l}
\\
\frac{\frac{lo}{hi} \cdot x - lo}{hi}
\end{array}
Herbie found 3 alternatives:
| Alternative | Accuracy | Speedup |
|---|
Results
Initial program 3.1%
Taylor expanded in lo around 0 18.8%
Simplified18.8%
[Start]18.8% | \[ \frac{x}{hi} + -1 \cdot \left(lo \cdot \left(\frac{1}{hi} + -1 \cdot \frac{x}{{hi}^{2}}\right)\right)
\] |
|---|---|
mul-1-neg [=>]18.8% | \[ \frac{x}{hi} + \color{blue}{\left(-lo \cdot \left(\frac{1}{hi} + -1 \cdot \frac{x}{{hi}^{2}}\right)\right)}
\] |
unsub-neg [=>]18.8% | \[ \color{blue}{\frac{x}{hi} - lo \cdot \left(\frac{1}{hi} + -1 \cdot \frac{x}{{hi}^{2}}\right)}
\] |
mul-1-neg [=>]18.8% | \[ \frac{x}{hi} - lo \cdot \left(\frac{1}{hi} + \color{blue}{\left(-\frac{x}{{hi}^{2}}\right)}\right)
\] |
unsub-neg [=>]18.8% | \[ \frac{x}{hi} - lo \cdot \color{blue}{\left(\frac{1}{hi} - \frac{x}{{hi}^{2}}\right)}
\] |
unpow2 [=>]18.8% | \[ \frac{x}{hi} - lo \cdot \left(\frac{1}{hi} - \frac{x}{\color{blue}{hi \cdot hi}}\right)
\] |
Taylor expanded in lo around -inf 18.8%
Simplified18.8%
[Start]18.8% | \[ -1 \cdot \left(\left(\frac{1}{hi} - \frac{x}{{hi}^{2}}\right) \cdot lo\right)
\] |
|---|---|
mul-1-neg [=>]18.8% | \[ \color{blue}{-\left(\frac{1}{hi} - \frac{x}{{hi}^{2}}\right) \cdot lo}
\] |
*-commutative [=>]18.8% | \[ -\color{blue}{lo \cdot \left(\frac{1}{hi} - \frac{x}{{hi}^{2}}\right)}
\] |
unpow-1 [<=]18.8% | \[ -lo \cdot \left(\color{blue}{{hi}^{-1}} - \frac{x}{{hi}^{2}}\right)
\] |
sub-neg [=>]18.8% | \[ -lo \cdot \color{blue}{\left({hi}^{-1} + \left(-\frac{x}{{hi}^{2}}\right)\right)}
\] |
mul-1-neg [<=]18.8% | \[ -lo \cdot \left({hi}^{-1} + \color{blue}{-1 \cdot \frac{x}{{hi}^{2}}}\right)
\] |
distribute-rgt-in [=>]18.8% | \[ -\color{blue}{\left({hi}^{-1} \cdot lo + \left(-1 \cdot \frac{x}{{hi}^{2}}\right) \cdot lo\right)}
\] |
unpow-1 [=>]18.8% | \[ -\left(\color{blue}{\frac{1}{hi}} \cdot lo + \left(-1 \cdot \frac{x}{{hi}^{2}}\right) \cdot lo\right)
\] |
associate-*l/ [=>]18.8% | \[ -\left(\color{blue}{\frac{1 \cdot lo}{hi}} + \left(-1 \cdot \frac{x}{{hi}^{2}}\right) \cdot lo\right)
\] |
*-lft-identity [=>]18.8% | \[ -\left(\frac{\color{blue}{lo}}{hi} + \left(-1 \cdot \frac{x}{{hi}^{2}}\right) \cdot lo\right)
\] |
associate-*r/ [=>]18.8% | \[ -\left(\frac{lo}{hi} + \color{blue}{\frac{-1 \cdot x}{{hi}^{2}}} \cdot lo\right)
\] |
associate-*l/ [=>]10.0% | \[ -\left(\frac{lo}{hi} + \color{blue}{\frac{\left(-1 \cdot x\right) \cdot lo}{{hi}^{2}}}\right)
\] |
associate-*r* [<=]10.0% | \[ -\left(\frac{lo}{hi} + \frac{\color{blue}{-1 \cdot \left(x \cdot lo\right)}}{{hi}^{2}}\right)
\] |
*-commutative [<=]10.0% | \[ -\left(\frac{lo}{hi} + \frac{-1 \cdot \color{blue}{\left(lo \cdot x\right)}}{{hi}^{2}}\right)
\] |
mul-1-neg [=>]10.0% | \[ -\left(\frac{lo}{hi} + \frac{\color{blue}{-lo \cdot x}}{{hi}^{2}}\right)
\] |
distribute-neg-frac [<=]10.0% | \[ -\left(\frac{lo}{hi} + \color{blue}{\left(-\frac{lo \cdot x}{{hi}^{2}}\right)}\right)
\] |
unsub-neg [=>]10.0% | \[ -\color{blue}{\left(\frac{lo}{hi} - \frac{lo \cdot x}{{hi}^{2}}\right)}
\] |
unpow2 [=>]10.0% | \[ -\left(\frac{lo}{hi} - \frac{lo \cdot x}{\color{blue}{hi \cdot hi}}\right)
\] |
times-frac [=>]18.8% | \[ -\left(\frac{lo}{hi} - \color{blue}{\frac{lo}{hi} \cdot \frac{x}{hi}}\right)
\] |
Applied egg-rr18.8%
[Start]18.8% | \[ -\left(\frac{lo}{hi} - \frac{lo}{hi} \cdot \frac{x}{hi}\right)
\] |
|---|---|
associate-*r/ [=>]18.8% | \[ -\left(\frac{lo}{hi} - \color{blue}{\frac{\frac{lo}{hi} \cdot x}{hi}}\right)
\] |
sub-div [=>]18.8% | \[ -\color{blue}{\frac{lo - \frac{lo}{hi} \cdot x}{hi}}
\] |
Final simplification18.8%
| Alternative 1 | |
|---|---|
| Accuracy | 18.8% |
| Cost | 576 |
| Alternative 2 | |
|---|---|
| Accuracy | 18.8% |
| Cost | 256 |
| Alternative 3 | |
|---|---|
| Accuracy | 18.7% |
| Cost | 64 |
herbie shell --seed 2023167
(FPCore (lo hi x)
:name "xlohi (overflows)"
:precision binary64
:pre (and (< lo -1e+308) (> hi 1e+308))
(/ (- x lo) (- hi lo)))