
(FPCore (lo hi x) :precision binary64 (/ (- x lo) (- hi lo)))
double code(double lo, double hi, double x) {
return (x - lo) / (hi - lo);
}
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
public static double code(double lo, double hi, double x) {
return (x - lo) / (hi - lo);
}
def code(lo, hi, x): return (x - lo) / (hi - lo)
function code(lo, hi, x) return Float64(Float64(x - lo) / Float64(hi - lo)) end
function tmp = code(lo, hi, x) tmp = (x - lo) / (hi - lo); end
code[lo_, hi_, x_] := N[(N[(x - lo), $MachinePrecision] / N[(hi - lo), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{x - lo}{hi - lo}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 7 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (lo hi x) :precision binary64 (/ (- x lo) (- hi lo)))
double code(double lo, double hi, double x) {
return (x - lo) / (hi - lo);
}
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
public static double code(double lo, double hi, double x) {
return (x - lo) / (hi - lo);
}
def code(lo, hi, x): return (x - lo) / (hi - lo)
function code(lo, hi, x) return Float64(Float64(x - lo) / Float64(hi - lo)) end
function tmp = code(lo, hi, x) tmp = (x - lo) / (hi - lo); end
code[lo_, hi_, x_] := N[(N[(x - lo), $MachinePrecision] / N[(hi - lo), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{x - lo}{hi - lo}
\end{array}
(FPCore (lo hi x)
:precision binary64
(let* ((t_0 (- 1.0 (pow (* (/ (- hi x) lo) (+ 1.0 (/ hi lo))) 2.0))))
(if (<= x -1.35e+154)
(* t_0 (/ 1.0 (+ 1.0 (+ (/ x lo) (/ (- (* hi (/ x lo)) hi) lo)))))
(if (<= x 1.32e+154)
(*
(- 1.0 (/ (pow x 2.0) (pow lo 2.0)))
(/ 1.0 (+ 1.0 (+ (/ x lo) (* hi (+ (/ x (pow lo 2.0)) (/ -1.0 lo)))))))
(*
t_0
(/
1.0
(+ 1.0 (+ (/ x lo) (* hi (- (/ -1.0 lo) (/ (/ x lo) lo)))))))))))
double code(double lo, double hi, double x) {
double t_0 = 1.0 - pow((((hi - x) / lo) * (1.0 + (hi / lo))), 2.0);
double tmp;
if (x <= -1.35e+154) {
tmp = t_0 * (1.0 / (1.0 + ((x / lo) + (((hi * (x / lo)) - hi) / lo))));
} else if (x <= 1.32e+154) {
tmp = (1.0 - (pow(x, 2.0) / pow(lo, 2.0))) * (1.0 / (1.0 + ((x / lo) + (hi * ((x / pow(lo, 2.0)) + (-1.0 / lo))))));
} else {
tmp = t_0 * (1.0 / (1.0 + ((x / lo) + (hi * ((-1.0 / lo) - ((x / lo) / 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
real(8) :: t_0
real(8) :: tmp
t_0 = 1.0d0 - ((((hi - x) / lo) * (1.0d0 + (hi / lo))) ** 2.0d0)
if (x <= (-1.35d+154)) then
tmp = t_0 * (1.0d0 / (1.0d0 + ((x / lo) + (((hi * (x / lo)) - hi) / lo))))
else if (x <= 1.32d+154) then
tmp = (1.0d0 - ((x ** 2.0d0) / (lo ** 2.0d0))) * (1.0d0 / (1.0d0 + ((x / lo) + (hi * ((x / (lo ** 2.0d0)) + ((-1.0d0) / lo))))))
else
tmp = t_0 * (1.0d0 / (1.0d0 + ((x / lo) + (hi * (((-1.0d0) / lo) - ((x / lo) / lo))))))
end if
code = tmp
end function
public static double code(double lo, double hi, double x) {
double t_0 = 1.0 - Math.pow((((hi - x) / lo) * (1.0 + (hi / lo))), 2.0);
double tmp;
if (x <= -1.35e+154) {
tmp = t_0 * (1.0 / (1.0 + ((x / lo) + (((hi * (x / lo)) - hi) / lo))));
} else if (x <= 1.32e+154) {
tmp = (1.0 - (Math.pow(x, 2.0) / Math.pow(lo, 2.0))) * (1.0 / (1.0 + ((x / lo) + (hi * ((x / Math.pow(lo, 2.0)) + (-1.0 / lo))))));
} else {
tmp = t_0 * (1.0 / (1.0 + ((x / lo) + (hi * ((-1.0 / lo) - ((x / lo) / lo))))));
}
return tmp;
}
def code(lo, hi, x): t_0 = 1.0 - math.pow((((hi - x) / lo) * (1.0 + (hi / lo))), 2.0) tmp = 0 if x <= -1.35e+154: tmp = t_0 * (1.0 / (1.0 + ((x / lo) + (((hi * (x / lo)) - hi) / lo)))) elif x <= 1.32e+154: tmp = (1.0 - (math.pow(x, 2.0) / math.pow(lo, 2.0))) * (1.0 / (1.0 + ((x / lo) + (hi * ((x / math.pow(lo, 2.0)) + (-1.0 / lo)))))) else: tmp = t_0 * (1.0 / (1.0 + ((x / lo) + (hi * ((-1.0 / lo) - ((x / lo) / lo)))))) return tmp
function code(lo, hi, x) t_0 = Float64(1.0 - (Float64(Float64(Float64(hi - x) / lo) * Float64(1.0 + Float64(hi / lo))) ^ 2.0)) tmp = 0.0 if (x <= -1.35e+154) tmp = Float64(t_0 * Float64(1.0 / Float64(1.0 + Float64(Float64(x / lo) + Float64(Float64(Float64(hi * Float64(x / lo)) - hi) / lo))))); elseif (x <= 1.32e+154) tmp = Float64(Float64(1.0 - Float64((x ^ 2.0) / (lo ^ 2.0))) * Float64(1.0 / Float64(1.0 + Float64(Float64(x / lo) + Float64(hi * Float64(Float64(x / (lo ^ 2.0)) + Float64(-1.0 / lo))))))); else tmp = Float64(t_0 * Float64(1.0 / Float64(1.0 + Float64(Float64(x / lo) + Float64(hi * Float64(Float64(-1.0 / lo) - Float64(Float64(x / lo) / lo))))))); end return tmp end
function tmp_2 = code(lo, hi, x) t_0 = 1.0 - ((((hi - x) / lo) * (1.0 + (hi / lo))) ^ 2.0); tmp = 0.0; if (x <= -1.35e+154) tmp = t_0 * (1.0 / (1.0 + ((x / lo) + (((hi * (x / lo)) - hi) / lo)))); elseif (x <= 1.32e+154) tmp = (1.0 - ((x ^ 2.0) / (lo ^ 2.0))) * (1.0 / (1.0 + ((x / lo) + (hi * ((x / (lo ^ 2.0)) + (-1.0 / lo)))))); else tmp = t_0 * (1.0 / (1.0 + ((x / lo) + (hi * ((-1.0 / lo) - ((x / lo) / lo)))))); end tmp_2 = tmp; end
code[lo_, hi_, x_] := Block[{t$95$0 = N[(1.0 - N[Power[N[(N[(N[(hi - x), $MachinePrecision] / lo), $MachinePrecision] * N[(1.0 + N[(hi / lo), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], 2.0], $MachinePrecision]), $MachinePrecision]}, If[LessEqual[x, -1.35e+154], N[(t$95$0 * N[(1.0 / N[(1.0 + N[(N[(x / lo), $MachinePrecision] + N[(N[(N[(hi * N[(x / lo), $MachinePrecision]), $MachinePrecision] - hi), $MachinePrecision] / lo), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[x, 1.32e+154], N[(N[(1.0 - N[(N[Power[x, 2.0], $MachinePrecision] / N[Power[lo, 2.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[(1.0 / N[(1.0 + N[(N[(x / lo), $MachinePrecision] + N[(hi * N[(N[(x / N[Power[lo, 2.0], $MachinePrecision]), $MachinePrecision] + N[(-1.0 / lo), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(t$95$0 * N[(1.0 / N[(1.0 + N[(N[(x / lo), $MachinePrecision] + N[(hi * N[(N[(-1.0 / lo), $MachinePrecision] - N[(N[(x / lo), $MachinePrecision] / lo), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := 1 - {\left(\frac{hi - x}{lo} \cdot \left(1 + \frac{hi}{lo}\right)\right)}^{2}\\
\mathbf{if}\;x \leq -1.35 \cdot 10^{+154}:\\
\;\;\;\;t\_0 \cdot \frac{1}{1 + \left(\frac{x}{lo} + \frac{hi \cdot \frac{x}{lo} - hi}{lo}\right)}\\
\mathbf{elif}\;x \leq 1.32 \cdot 10^{+154}:\\
\;\;\;\;\left(1 - \frac{{x}^{2}}{{lo}^{2}}\right) \cdot \frac{1}{1 + \left(\frac{x}{lo} + hi \cdot \left(\frac{x}{{lo}^{2}} + \frac{-1}{lo}\right)\right)}\\
\mathbf{else}:\\
\;\;\;\;t\_0 \cdot \frac{1}{1 + \left(\frac{x}{lo} + hi \cdot \left(\frac{-1}{lo} - \frac{\frac{x}{lo}}{lo}\right)\right)}\\
\end{array}
\end{array}
if x < -1.35000000000000003e154Initial program 3.1%
Taylor expanded in lo around inf 0.0%
Simplified18.8%
flip-+18.8%
div-inv18.8%
metadata-eval18.8%
pow218.8%
Applied egg-rr18.8%
Taylor expanded in hi around 0 26.7%
Taylor expanded in lo around inf 3.1%
mul-1-neg3.1%
unsub-neg3.1%
associate-/l*26.7%
Simplified26.7%
if -1.35000000000000003e154 < x < 1.31999999999999998e154Initial program 3.1%
Taylor expanded in lo around inf 0.0%
Simplified18.8%
flip-+18.8%
div-inv18.8%
metadata-eval18.8%
pow218.8%
Applied egg-rr18.8%
Taylor expanded in hi around 0 25.9%
Taylor expanded in hi around 0 99.0%
if 1.31999999999999998e154 < x Initial program 3.1%
Taylor expanded in lo around inf 0.0%
Simplified19.0%
flip-+19.0%
div-inv19.0%
metadata-eval19.0%
pow219.0%
Applied egg-rr19.0%
Taylor expanded in hi around 0 27.7%
add-sqr-sqrt27.7%
sqrt-unprod27.7%
sqr-neg27.7%
mul-1-neg27.7%
mul-1-neg27.7%
sqrt-unprod27.7%
add-sqr-sqrt27.7%
associate-*r/27.7%
unpow227.7%
times-frac27.7%
Applied egg-rr27.7%
associate-*l/27.7%
mul-1-neg27.7%
Simplified27.7%
Final simplification79.1%
(FPCore (lo hi x) :precision binary64 (* (- 1.0 (pow (* (/ (- hi x) lo) (+ 1.0 (/ hi lo))) 2.0)) (/ 1.0 (+ 1.0 (+ (/ x lo) (* hi (- (/ -1.0 lo) (/ (/ x lo) lo))))))))
double code(double lo, double hi, double x) {
return (1.0 - pow((((hi - x) / lo) * (1.0 + (hi / lo))), 2.0)) * (1.0 / (1.0 + ((x / lo) + (hi * ((-1.0 / lo) - ((x / lo) / lo))))));
}
real(8) function code(lo, hi, x)
real(8), intent (in) :: lo
real(8), intent (in) :: hi
real(8), intent (in) :: x
code = (1.0d0 - ((((hi - x) / lo) * (1.0d0 + (hi / lo))) ** 2.0d0)) * (1.0d0 / (1.0d0 + ((x / lo) + (hi * (((-1.0d0) / lo) - ((x / lo) / lo))))))
end function
public static double code(double lo, double hi, double x) {
return (1.0 - Math.pow((((hi - x) / lo) * (1.0 + (hi / lo))), 2.0)) * (1.0 / (1.0 + ((x / lo) + (hi * ((-1.0 / lo) - ((x / lo) / lo))))));
}
def code(lo, hi, x): return (1.0 - math.pow((((hi - x) / lo) * (1.0 + (hi / lo))), 2.0)) * (1.0 / (1.0 + ((x / lo) + (hi * ((-1.0 / lo) - ((x / lo) / lo))))))
function code(lo, hi, x) return Float64(Float64(1.0 - (Float64(Float64(Float64(hi - x) / lo) * Float64(1.0 + Float64(hi / lo))) ^ 2.0)) * Float64(1.0 / Float64(1.0 + Float64(Float64(x / lo) + Float64(hi * Float64(Float64(-1.0 / lo) - Float64(Float64(x / lo) / lo))))))) end
function tmp = code(lo, hi, x) tmp = (1.0 - ((((hi - x) / lo) * (1.0 + (hi / lo))) ^ 2.0)) * (1.0 / (1.0 + ((x / lo) + (hi * ((-1.0 / lo) - ((x / lo) / lo)))))); end
code[lo_, hi_, x_] := N[(N[(1.0 - N[Power[N[(N[(N[(hi - x), $MachinePrecision] / lo), $MachinePrecision] * N[(1.0 + N[(hi / lo), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], 2.0], $MachinePrecision]), $MachinePrecision] * N[(1.0 / N[(1.0 + N[(N[(x / lo), $MachinePrecision] + N[(hi * N[(N[(-1.0 / lo), $MachinePrecision] - N[(N[(x / lo), $MachinePrecision] / lo), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\left(1 - {\left(\frac{hi - x}{lo} \cdot \left(1 + \frac{hi}{lo}\right)\right)}^{2}\right) \cdot \frac{1}{1 + \left(\frac{x}{lo} + hi \cdot \left(\frac{-1}{lo} - \frac{\frac{x}{lo}}{lo}\right)\right)}
\end{array}
Initial program 3.1%
Taylor expanded in lo around inf 0.0%
Simplified18.9%
flip-+18.9%
div-inv18.9%
metadata-eval18.9%
pow218.9%
Applied egg-rr18.9%
Taylor expanded in hi around 0 26.3%
add-sqr-sqrt26.3%
sqrt-unprod26.3%
sqr-neg26.3%
mul-1-neg26.3%
mul-1-neg26.3%
sqrt-unprod26.3%
add-sqr-sqrt26.3%
associate-*r/26.3%
unpow226.3%
times-frac26.3%
Applied egg-rr26.3%
associate-*l/26.3%
mul-1-neg26.3%
Simplified26.3%
Final simplification26.3%
(FPCore (lo hi x)
:precision binary64
(let* ((t_0 (/ (- hi x) lo)))
(*
(+ 1.0 (* (* t_0 (+ 1.0 (/ hi lo))) (* t_0 (- -1.0 (/ hi lo)))))
(/ 1.0 (+ 1.0 (/ (- x hi) lo))))))
double code(double lo, double hi, double x) {
double t_0 = (hi - x) / lo;
return (1.0 + ((t_0 * (1.0 + (hi / lo))) * (t_0 * (-1.0 - (hi / lo))))) * (1.0 / (1.0 + ((x - hi) / lo)));
}
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
t_0 = (hi - x) / lo
code = (1.0d0 + ((t_0 * (1.0d0 + (hi / lo))) * (t_0 * ((-1.0d0) - (hi / lo))))) * (1.0d0 / (1.0d0 + ((x - hi) / lo)))
end function
public static double code(double lo, double hi, double x) {
double t_0 = (hi - x) / lo;
return (1.0 + ((t_0 * (1.0 + (hi / lo))) * (t_0 * (-1.0 - (hi / lo))))) * (1.0 / (1.0 + ((x - hi) / lo)));
}
def code(lo, hi, x): t_0 = (hi - x) / lo return (1.0 + ((t_0 * (1.0 + (hi / lo))) * (t_0 * (-1.0 - (hi / lo))))) * (1.0 / (1.0 + ((x - hi) / lo)))
function code(lo, hi, x) t_0 = Float64(Float64(hi - x) / lo) return Float64(Float64(1.0 + Float64(Float64(t_0 * Float64(1.0 + Float64(hi / lo))) * Float64(t_0 * Float64(-1.0 - Float64(hi / lo))))) * Float64(1.0 / Float64(1.0 + Float64(Float64(x - hi) / lo)))) end
function tmp = code(lo, hi, x) t_0 = (hi - x) / lo; tmp = (1.0 + ((t_0 * (1.0 + (hi / lo))) * (t_0 * (-1.0 - (hi / lo))))) * (1.0 / (1.0 + ((x - hi) / lo))); end
code[lo_, hi_, x_] := Block[{t$95$0 = N[(N[(hi - x), $MachinePrecision] / lo), $MachinePrecision]}, N[(N[(1.0 + N[(N[(t$95$0 * N[(1.0 + N[(hi / lo), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[(t$95$0 * N[(-1.0 - N[(hi / lo), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[(1.0 / N[(1.0 + N[(N[(x - hi), $MachinePrecision] / lo), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \frac{hi - x}{lo}\\
\left(1 + \left(t\_0 \cdot \left(1 + \frac{hi}{lo}\right)\right) \cdot \left(t\_0 \cdot \left(-1 - \frac{hi}{lo}\right)\right)\right) \cdot \frac{1}{1 + \frac{x - hi}{lo}}
\end{array}
\end{array}
Initial program 3.1%
Taylor expanded in lo around inf 0.0%
Simplified18.9%
flip-+18.9%
div-inv18.9%
metadata-eval18.9%
pow218.9%
Applied egg-rr18.9%
unpow218.9%
+-commutative18.9%
+-commutative18.9%
Applied egg-rr18.9%
Taylor expanded in hi around 0 26.3%
Final simplification26.3%
(FPCore (lo hi x) :precision binary64 (+ 1.0 (* hi (/ (+ 1.0 (/ hi lo)) lo))))
double code(double lo, double hi, double x) {
return 1.0 + (hi * ((1.0 + (hi / lo)) / lo));
}
real(8) function code(lo, hi, x)
real(8), intent (in) :: lo
real(8), intent (in) :: hi
real(8), intent (in) :: x
code = 1.0d0 + (hi * ((1.0d0 + (hi / lo)) / lo))
end function
public static double code(double lo, double hi, double x) {
return 1.0 + (hi * ((1.0 + (hi / lo)) / lo));
}
def code(lo, hi, x): return 1.0 + (hi * ((1.0 + (hi / lo)) / lo))
function code(lo, hi, x) return Float64(1.0 + Float64(hi * Float64(Float64(1.0 + Float64(hi / lo)) / lo))) end
function tmp = code(lo, hi, x) tmp = 1.0 + (hi * ((1.0 + (hi / lo)) / lo)); end
code[lo_, hi_, x_] := N[(1.0 + N[(hi * N[(N[(1.0 + N[(hi / lo), $MachinePrecision]), $MachinePrecision] / lo), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
1 + hi \cdot \frac{1 + \frac{hi}{lo}}{lo}
\end{array}
Initial program 3.1%
Taylor expanded in lo around inf 0.0%
Simplified18.9%
Taylor expanded in x around 0 18.9%
associate-/l*18.9%
Simplified18.9%
Final simplification18.9%
(FPCore (lo hi x) :precision binary64 (/ (- x lo) hi))
double code(double lo, double hi, double x) {
return (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
end function
public static double code(double lo, double hi, double x) {
return (x - lo) / hi;
}
def code(lo, hi, x): return (x - lo) / hi
function code(lo, hi, x) return Float64(Float64(x - lo) / hi) end
function tmp = code(lo, hi, x) tmp = (x - lo) / hi; end
code[lo_, hi_, x_] := N[(N[(x - lo), $MachinePrecision] / hi), $MachinePrecision]
\begin{array}{l}
\\
\frac{x - lo}{hi}
\end{array}
Initial program 3.1%
Taylor expanded in hi around inf 18.8%
Final simplification18.8%
(FPCore (lo hi x) :precision binary64 (/ lo (- hi)))
double code(double lo, double hi, double x) {
return 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 = lo / -hi
end function
public static double code(double lo, double hi, double x) {
return lo / -hi;
}
def code(lo, hi, x): return lo / -hi
function code(lo, hi, x) return Float64(lo / Float64(-hi)) end
function tmp = code(lo, hi, x) tmp = lo / -hi; end
code[lo_, hi_, x_] := N[(lo / (-hi)), $MachinePrecision]
\begin{array}{l}
\\
\frac{lo}{-hi}
\end{array}
Initial program 3.1%
Taylor expanded in hi around inf 18.8%
Taylor expanded in x around 0 18.8%
associate-*r/18.8%
neg-mul-118.8%
Simplified18.8%
Final simplification18.8%
(FPCore (lo hi x) :precision binary64 1.0)
double code(double lo, double hi, double x) {
return 1.0;
}
real(8) function code(lo, hi, x)
real(8), intent (in) :: lo
real(8), intent (in) :: hi
real(8), intent (in) :: x
code = 1.0d0
end function
public static double code(double lo, double hi, double x) {
return 1.0;
}
def code(lo, hi, x): return 1.0
function code(lo, hi, x) return 1.0 end
function tmp = code(lo, hi, x) tmp = 1.0; end
code[lo_, hi_, x_] := 1.0
\begin{array}{l}
\\
1
\end{array}
Initial program 3.1%
Taylor expanded in lo around inf 18.7%
Final simplification18.7%
herbie shell --seed 2024071
(FPCore (lo hi x)
:name "xlohi (overflows)"
:precision binary64
:pre (and (< lo -1e+308) (> hi 1e+308))
(/ (- x lo) (- hi lo)))