
(FPCore (u v t1) :precision binary64 (/ (* (- t1) v) (* (+ t1 u) (+ t1 u))))
double code(double u, double v, double t1) {
return (-t1 * v) / ((t1 + u) * (t1 + u));
}
real(8) function code(u, v, t1)
real(8), intent (in) :: u
real(8), intent (in) :: v
real(8), intent (in) :: t1
code = (-t1 * v) / ((t1 + u) * (t1 + u))
end function
public static double code(double u, double v, double t1) {
return (-t1 * v) / ((t1 + u) * (t1 + u));
}
def code(u, v, t1): return (-t1 * v) / ((t1 + u) * (t1 + u))
function code(u, v, t1) return Float64(Float64(Float64(-t1) * v) / Float64(Float64(t1 + u) * Float64(t1 + u))) end
function tmp = code(u, v, t1) tmp = (-t1 * v) / ((t1 + u) * (t1 + u)); end
code[u_, v_, t1_] := N[(N[((-t1) * v), $MachinePrecision] / N[(N[(t1 + u), $MachinePrecision] * N[(t1 + u), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{\left(-t1\right) \cdot v}{\left(t1 + u\right) \cdot \left(t1 + u\right)}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 10 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (u v t1) :precision binary64 (/ (* (- t1) v) (* (+ t1 u) (+ t1 u))))
double code(double u, double v, double t1) {
return (-t1 * v) / ((t1 + u) * (t1 + u));
}
real(8) function code(u, v, t1)
real(8), intent (in) :: u
real(8), intent (in) :: v
real(8), intent (in) :: t1
code = (-t1 * v) / ((t1 + u) * (t1 + u))
end function
public static double code(double u, double v, double t1) {
return (-t1 * v) / ((t1 + u) * (t1 + u));
}
def code(u, v, t1): return (-t1 * v) / ((t1 + u) * (t1 + u))
function code(u, v, t1) return Float64(Float64(Float64(-t1) * v) / Float64(Float64(t1 + u) * Float64(t1 + u))) end
function tmp = code(u, v, t1) tmp = (-t1 * v) / ((t1 + u) * (t1 + u)); end
code[u_, v_, t1_] := N[(N[((-t1) * v), $MachinePrecision] / N[(N[(t1 + u), $MachinePrecision] * N[(t1 + u), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{\left(-t1\right) \cdot v}{\left(t1 + u\right) \cdot \left(t1 + u\right)}
\end{array}
v\_m = (fabs.f64 v)
v\_s = (copysign.f64 #s(literal 1 binary64) v)
(FPCore (v_s u v_m t1)
:precision binary64
(*
v_s
(if (<= (/ (* t1 v_m) (* (- (+ u t1)) (+ u t1))) -5e+68)
(/ (- v_m) (fma (+ 2.0 (/ u t1)) u t1))
(* (/ (- t1) (+ u t1)) (/ v_m (+ u t1))))))v\_m = fabs(v);
v\_s = copysign(1.0, v);
double code(double v_s, double u, double v_m, double t1) {
double tmp;
if (((t1 * v_m) / (-(u + t1) * (u + t1))) <= -5e+68) {
tmp = -v_m / fma((2.0 + (u / t1)), u, t1);
} else {
tmp = (-t1 / (u + t1)) * (v_m / (u + t1));
}
return v_s * tmp;
}
v\_m = abs(v) v\_s = copysign(1.0, v) function code(v_s, u, v_m, t1) tmp = 0.0 if (Float64(Float64(t1 * v_m) / Float64(Float64(-Float64(u + t1)) * Float64(u + t1))) <= -5e+68) tmp = Float64(Float64(-v_m) / fma(Float64(2.0 + Float64(u / t1)), u, t1)); else tmp = Float64(Float64(Float64(-t1) / Float64(u + t1)) * Float64(v_m / Float64(u + t1))); end return Float64(v_s * tmp) end
v\_m = N[Abs[v], $MachinePrecision]
v\_s = N[With[{TMP1 = Abs[1.0], TMP2 = Sign[v]}, TMP1 * If[TMP2 == 0, 1, TMP2]], $MachinePrecision]
code[v$95$s_, u_, v$95$m_, t1_] := N[(v$95$s * If[LessEqual[N[(N[(t1 * v$95$m), $MachinePrecision] / N[((-N[(u + t1), $MachinePrecision]) * N[(u + t1), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], -5e+68], N[((-v$95$m) / N[(N[(2.0 + N[(u / t1), $MachinePrecision]), $MachinePrecision] * u + t1), $MachinePrecision]), $MachinePrecision], N[(N[((-t1) / N[(u + t1), $MachinePrecision]), $MachinePrecision] * N[(v$95$m / N[(u + t1), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]), $MachinePrecision]
\begin{array}{l}
v\_m = \left|v\right|
\\
v\_s = \mathsf{copysign}\left(1, v\right)
\\
v\_s \cdot \begin{array}{l}
\mathbf{if}\;\frac{t1 \cdot v\_m}{\left(-\left(u + t1\right)\right) \cdot \left(u + t1\right)} \leq -5 \cdot 10^{+68}:\\
\;\;\;\;\frac{-v\_m}{\mathsf{fma}\left(2 + \frac{u}{t1}, u, t1\right)}\\
\mathbf{else}:\\
\;\;\;\;\frac{-t1}{u + t1} \cdot \frac{v\_m}{u + t1}\\
\end{array}
\end{array}
if (/.f64 (*.f64 (neg.f64 t1) v) (*.f64 (+.f64 t1 u) (+.f64 t1 u))) < -5.0000000000000004e68Initial program 76.0%
lift-/.f64N/A
lift-*.f64N/A
associate-/r*N/A
lower-/.f64N/A
frac-2negN/A
lift-*.f64N/A
*-commutativeN/A
distribute-lft-neg-inN/A
associate-/l*N/A
lift-neg.f64N/A
frac-2negN/A
lower-*.f64N/A
lower-neg.f64N/A
lower-/.f6499.6
lift-+.f64N/A
+-commutativeN/A
lower-+.f6499.6
lift-+.f64N/A
+-commutativeN/A
lower-+.f6499.6
Applied rewrites99.6%
lift-/.f64N/A
lift-*.f64N/A
*-commutativeN/A
associate-*r/N/A
lift-/.f64N/A
clear-numN/A
frac-timesN/A
*-lft-identityN/A
lower-/.f64N/A
lower-*.f64N/A
lower-/.f6499.9
Applied rewrites99.9%
Taylor expanded in u around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f64N/A
+-commutativeN/A
lower-+.f64N/A
lower-/.f6499.9
Applied rewrites99.9%
if -5.0000000000000004e68 < (/.f64 (*.f64 (neg.f64 t1) v) (*.f64 (+.f64 t1 u) (+.f64 t1 u))) Initial program 77.8%
lift-/.f64N/A
lift-*.f64N/A
*-commutativeN/A
lift-neg.f64N/A
neg-mul-1N/A
associate-*r*N/A
lift-*.f64N/A
times-fracN/A
*-commutativeN/A
neg-mul-1N/A
lower-*.f64N/A
lower-/.f64N/A
lower-neg.f64N/A
lift-+.f64N/A
+-commutativeN/A
lower-+.f64N/A
lower-/.f6498.5
lift-+.f64N/A
+-commutativeN/A
lower-+.f6498.5
Applied rewrites98.5%
Final simplification98.7%
v\_m = (fabs.f64 v)
v\_s = (copysign.f64 #s(literal 1 binary64) v)
(FPCore (v_s u v_m t1)
:precision binary64
(let* ((t_1 (/ (- v_m) (fma 2.0 u t1))))
(*
v_s
(if (<= t1 -8e+141)
t_1
(if (<= t1 6e+144) (* (/ (- t1) (* (+ u t1) (+ u t1))) v_m) t_1)))))v\_m = fabs(v);
v\_s = copysign(1.0, v);
double code(double v_s, double u, double v_m, double t1) {
double t_1 = -v_m / fma(2.0, u, t1);
double tmp;
if (t1 <= -8e+141) {
tmp = t_1;
} else if (t1 <= 6e+144) {
tmp = (-t1 / ((u + t1) * (u + t1))) * v_m;
} else {
tmp = t_1;
}
return v_s * tmp;
}
v\_m = abs(v) v\_s = copysign(1.0, v) function code(v_s, u, v_m, t1) t_1 = Float64(Float64(-v_m) / fma(2.0, u, t1)) tmp = 0.0 if (t1 <= -8e+141) tmp = t_1; elseif (t1 <= 6e+144) tmp = Float64(Float64(Float64(-t1) / Float64(Float64(u + t1) * Float64(u + t1))) * v_m); else tmp = t_1; end return Float64(v_s * tmp) end
v\_m = N[Abs[v], $MachinePrecision]
v\_s = N[With[{TMP1 = Abs[1.0], TMP2 = Sign[v]}, TMP1 * If[TMP2 == 0, 1, TMP2]], $MachinePrecision]
code[v$95$s_, u_, v$95$m_, t1_] := Block[{t$95$1 = N[((-v$95$m) / N[(2.0 * u + t1), $MachinePrecision]), $MachinePrecision]}, N[(v$95$s * If[LessEqual[t1, -8e+141], t$95$1, If[LessEqual[t1, 6e+144], N[(N[((-t1) / N[(N[(u + t1), $MachinePrecision] * N[(u + t1), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * v$95$m), $MachinePrecision], t$95$1]]), $MachinePrecision]]
\begin{array}{l}
v\_m = \left|v\right|
\\
v\_s = \mathsf{copysign}\left(1, v\right)
\\
\begin{array}{l}
t_1 := \frac{-v\_m}{\mathsf{fma}\left(2, u, t1\right)}\\
v\_s \cdot \begin{array}{l}
\mathbf{if}\;t1 \leq -8 \cdot 10^{+141}:\\
\;\;\;\;t\_1\\
\mathbf{elif}\;t1 \leq 6 \cdot 10^{+144}:\\
\;\;\;\;\frac{-t1}{\left(u + t1\right) \cdot \left(u + t1\right)} \cdot v\_m\\
\mathbf{else}:\\
\;\;\;\;t\_1\\
\end{array}
\end{array}
\end{array}
if t1 < -8.00000000000000014e141 or 5.9999999999999998e144 < t1 Initial program 42.8%
lift-/.f64N/A
lift-*.f64N/A
associate-/r*N/A
lower-/.f64N/A
frac-2negN/A
lift-*.f64N/A
*-commutativeN/A
distribute-lft-neg-inN/A
associate-/l*N/A
lift-neg.f64N/A
frac-2negN/A
lower-*.f64N/A
lower-neg.f64N/A
lower-/.f64100.0
lift-+.f64N/A
+-commutativeN/A
lower-+.f64100.0
lift-+.f64N/A
+-commutativeN/A
lower-+.f64100.0
Applied rewrites100.0%
lift-/.f64N/A
lift-*.f64N/A
*-commutativeN/A
associate-*r/N/A
lift-/.f64N/A
clear-numN/A
frac-timesN/A
*-lft-identityN/A
lower-/.f64N/A
lower-*.f64N/A
lower-/.f6497.9
Applied rewrites97.9%
Taylor expanded in u around 0
+-commutativeN/A
lower-fma.f6492.4
Applied rewrites92.4%
if -8.00000000000000014e141 < t1 < 5.9999999999999998e144Initial program 83.6%
lift-/.f64N/A
lift-*.f64N/A
*-commutativeN/A
associate-/l*N/A
*-commutativeN/A
lower-*.f64N/A
lower-/.f6487.6
lift-+.f64N/A
+-commutativeN/A
lower-+.f6487.6
lift-+.f64N/A
+-commutativeN/A
lower-+.f6487.6
Applied rewrites87.6%
herbie shell --seed 2024234
(FPCore (u v t1)
:name "Rosa's DopplerBench"
:precision binary64
(/ (* (- t1) v) (* (+ t1 u) (+ t1 u))))