
(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 8 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}
(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(t1 * Float64(v / Float64(t1 + u))) / Float64(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 * N[(v / N[(t1 + u), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[((-t1) - u), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{t1 \cdot \frac{v}{t1 + u}}{\left(-t1\right) - u}
\end{array}
Initial program 73.4%
lift-/.f64N/A
lift-*.f64N/A
*-commutativeN/A
lift-*.f64N/A
times-fracN/A
lift-neg.f64N/A
distribute-frac-negN/A
distribute-frac-neg2N/A
associate-*r/N/A
lower-/.f64N/A
lower-*.f64N/A
lower-/.f64N/A
lower-neg.f6498.4
Applied rewrites98.4%
Final simplification98.4%
(FPCore (u v t1)
:precision binary64
(let* ((t_1 (- (- t1) u)) (t_2 (/ (* v 1.0) t_1)))
(if (<= t1 -1.34e+154)
t_2
(if (<= t1 1.7e+113) (* v (/ t1 (* (+ t1 u) t_1))) t_2))))
double code(double u, double v, double t1) {
double t_1 = -t1 - u;
double t_2 = (v * 1.0) / t_1;
double tmp;
if (t1 <= -1.34e+154) {
tmp = t_2;
} else if (t1 <= 1.7e+113) {
tmp = v * (t1 / ((t1 + u) * t_1));
} else {
tmp = t_2;
}
return tmp;
}
real(8) function code(u, v, t1)
real(8), intent (in) :: u
real(8), intent (in) :: v
real(8), intent (in) :: t1
real(8) :: t_1
real(8) :: t_2
real(8) :: tmp
t_1 = -t1 - u
t_2 = (v * 1.0d0) / t_1
if (t1 <= (-1.34d+154)) then
tmp = t_2
else if (t1 <= 1.7d+113) then
tmp = v * (t1 / ((t1 + u) * t_1))
else
tmp = t_2
end if
code = tmp
end function
public static double code(double u, double v, double t1) {
double t_1 = -t1 - u;
double t_2 = (v * 1.0) / t_1;
double tmp;
if (t1 <= -1.34e+154) {
tmp = t_2;
} else if (t1 <= 1.7e+113) {
tmp = v * (t1 / ((t1 + u) * t_1));
} else {
tmp = t_2;
}
return tmp;
}
def code(u, v, t1): t_1 = -t1 - u t_2 = (v * 1.0) / t_1 tmp = 0 if t1 <= -1.34e+154: tmp = t_2 elif t1 <= 1.7e+113: tmp = v * (t1 / ((t1 + u) * t_1)) else: tmp = t_2 return tmp
function code(u, v, t1) t_1 = Float64(Float64(-t1) - u) t_2 = Float64(Float64(v * 1.0) / t_1) tmp = 0.0 if (t1 <= -1.34e+154) tmp = t_2; elseif (t1 <= 1.7e+113) tmp = Float64(v * Float64(t1 / Float64(Float64(t1 + u) * t_1))); else tmp = t_2; end return tmp end
function tmp_2 = code(u, v, t1) t_1 = -t1 - u; t_2 = (v * 1.0) / t_1; tmp = 0.0; if (t1 <= -1.34e+154) tmp = t_2; elseif (t1 <= 1.7e+113) tmp = v * (t1 / ((t1 + u) * t_1)); else tmp = t_2; end tmp_2 = tmp; end
code[u_, v_, t1_] := Block[{t$95$1 = N[((-t1) - u), $MachinePrecision]}, Block[{t$95$2 = N[(N[(v * 1.0), $MachinePrecision] / t$95$1), $MachinePrecision]}, If[LessEqual[t1, -1.34e+154], t$95$2, If[LessEqual[t1, 1.7e+113], N[(v * N[(t1 / N[(N[(t1 + u), $MachinePrecision] * t$95$1), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], t$95$2]]]]
\begin{array}{l}
\\
\begin{array}{l}
t_1 := \left(-t1\right) - u\\
t_2 := \frac{v \cdot 1}{t\_1}\\
\mathbf{if}\;t1 \leq -1.34 \cdot 10^{+154}:\\
\;\;\;\;t\_2\\
\mathbf{elif}\;t1 \leq 1.7 \cdot 10^{+113}:\\
\;\;\;\;v \cdot \frac{t1}{\left(t1 + u\right) \cdot t\_1}\\
\mathbf{else}:\\
\;\;\;\;t\_2\\
\end{array}
\end{array}
if t1 < -1.34000000000000001e154 or 1.70000000000000009e113 < t1 Initial program 42.7%
lift-/.f64N/A
clear-numN/A
associate-/r/N/A
lift-*.f64N/A
lift-neg.f64N/A
distribute-lft-neg-outN/A
distribute-rgt-neg-inN/A
associate-*r*N/A
lower-*.f64N/A
lower-*.f64N/A
lower-/.f64N/A
lower-neg.f6446.3
Applied rewrites46.3%
lift-*.f64N/A
*-commutativeN/A
lift-/.f64N/A
lift-*.f64N/A
associate-/r*N/A
associate-*r/N/A
div-invN/A
lower-/.f64N/A
lower-/.f6496.5
Applied rewrites96.5%
Taylor expanded in t1 around inf
Applied rewrites90.6%
lift-*.f64N/A
lift-+.f64N/A
lift-/.f64N/A
associate-*l/N/A
frac-2negN/A
lift-+.f64N/A
lift-neg.f64N/A
lower-/.f64N/A
*-commutativeN/A
distribute-lft-neg-inN/A
lift-neg.f64N/A
remove-double-negN/A
lower-*.f6490.8
lift-neg.f64N/A
lift-+.f64N/A
distribute-neg-inN/A
unsub-negN/A
lower--.f64N/A
lower-neg.f6490.8
Applied rewrites90.8%
if -1.34000000000000001e154 < t1 < 1.70000000000000009e113Initial program 83.7%
lift-/.f64N/A
lift-*.f64N/A
*-commutativeN/A
associate-/l*N/A
*-commutativeN/A
lower-*.f64N/A
lower-/.f6487.0
Applied rewrites87.0%
Final simplification88.1%
herbie shell --seed 2024230
(FPCore (u v t1)
:name "Rosa's DopplerBench"
:precision binary64
(/ (* (- t1) v) (* (+ t1 u) (+ t1 u))))