
(FPCore (x y) :precision binary64 (/ (* (* x 2.0) y) (- x y)))
double code(double x, double y) {
return ((x * 2.0) * y) / (x - y);
}
real(8) function code(x, y)
real(8), intent (in) :: x
real(8), intent (in) :: y
code = ((x * 2.0d0) * y) / (x - y)
end function
public static double code(double x, double y) {
return ((x * 2.0) * y) / (x - y);
}
def code(x, y): return ((x * 2.0) * y) / (x - y)
function code(x, y) return Float64(Float64(Float64(x * 2.0) * y) / Float64(x - y)) end
function tmp = code(x, y) tmp = ((x * 2.0) * y) / (x - y); end
code[x_, y_] := N[(N[(N[(x * 2.0), $MachinePrecision] * y), $MachinePrecision] / N[(x - y), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{\left(x \cdot 2\right) \cdot y}{x - y}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 5 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x y) :precision binary64 (/ (* (* x 2.0) y) (- x y)))
double code(double x, double y) {
return ((x * 2.0) * y) / (x - y);
}
real(8) function code(x, y)
real(8), intent (in) :: x
real(8), intent (in) :: y
code = ((x * 2.0d0) * y) / (x - y)
end function
public static double code(double x, double y) {
return ((x * 2.0) * y) / (x - y);
}
def code(x, y): return ((x * 2.0) * y) / (x - y)
function code(x, y) return Float64(Float64(Float64(x * 2.0) * y) / Float64(x - y)) end
function tmp = code(x, y) tmp = ((x * 2.0) * y) / (x - y); end
code[x_, y_] := N[(N[(N[(x * 2.0), $MachinePrecision] * y), $MachinePrecision] / N[(x - y), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{\left(x \cdot 2\right) \cdot y}{x - y}
\end{array}
(FPCore (x y)
:precision binary64
(if (<= x -1e+50)
(* y (/ (+ x x) (- x y)))
(if (<= x 3.6e-74)
(/ (* x 2.0) (/ (- x y) y))
(* 2.0 (/ y (- 1.0 (/ y x)))))))
double code(double x, double y) {
double tmp;
if (x <= -1e+50) {
tmp = y * ((x + x) / (x - y));
} else if (x <= 3.6e-74) {
tmp = (x * 2.0) / ((x - y) / y);
} else {
tmp = 2.0 * (y / (1.0 - (y / x)));
}
return tmp;
}
real(8) function code(x, y)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8) :: tmp
if (x <= (-1d+50)) then
tmp = y * ((x + x) / (x - y))
else if (x <= 3.6d-74) then
tmp = (x * 2.0d0) / ((x - y) / y)
else
tmp = 2.0d0 * (y / (1.0d0 - (y / x)))
end if
code = tmp
end function
public static double code(double x, double y) {
double tmp;
if (x <= -1e+50) {
tmp = y * ((x + x) / (x - y));
} else if (x <= 3.6e-74) {
tmp = (x * 2.0) / ((x - y) / y);
} else {
tmp = 2.0 * (y / (1.0 - (y / x)));
}
return tmp;
}
def code(x, y): tmp = 0 if x <= -1e+50: tmp = y * ((x + x) / (x - y)) elif x <= 3.6e-74: tmp = (x * 2.0) / ((x - y) / y) else: tmp = 2.0 * (y / (1.0 - (y / x))) return tmp
function code(x, y) tmp = 0.0 if (x <= -1e+50) tmp = Float64(y * Float64(Float64(x + x) / Float64(x - y))); elseif (x <= 3.6e-74) tmp = Float64(Float64(x * 2.0) / Float64(Float64(x - y) / y)); else tmp = Float64(2.0 * Float64(y / Float64(1.0 - Float64(y / x)))); end return tmp end
function tmp_2 = code(x, y) tmp = 0.0; if (x <= -1e+50) tmp = y * ((x + x) / (x - y)); elseif (x <= 3.6e-74) tmp = (x * 2.0) / ((x - y) / y); else tmp = 2.0 * (y / (1.0 - (y / x))); end tmp_2 = tmp; end
code[x_, y_] := If[LessEqual[x, -1e+50], N[(y * N[(N[(x + x), $MachinePrecision] / N[(x - y), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[x, 3.6e-74], N[(N[(x * 2.0), $MachinePrecision] / N[(N[(x - y), $MachinePrecision] / y), $MachinePrecision]), $MachinePrecision], N[(2.0 * N[(y / N[(1.0 - N[(y / x), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq -1 \cdot 10^{+50}:\\
\;\;\;\;y \cdot \frac{x + x}{x - y}\\
\mathbf{elif}\;x \leq 3.6 \cdot 10^{-74}:\\
\;\;\;\;\frac{x \cdot 2}{\frac{x - y}{y}}\\
\mathbf{else}:\\
\;\;\;\;2 \cdot \frac{y}{1 - \frac{y}{x}}\\
\end{array}
\end{array}
if x < -1.0000000000000001e50Initial program 82.3%
associate-/l*73.6%
Simplified73.6%
associate-/r/100.0%
add-log-exp3.2%
exp-lft-sqr3.2%
log-prod3.2%
add-log-exp3.2%
add-log-exp100.0%
Applied egg-rr100.0%
if -1.0000000000000001e50 < x < 3.6000000000000002e-74Initial program 79.6%
associate-/l*99.9%
Simplified99.9%
if 3.6000000000000002e-74 < x Initial program 78.0%
*-commutative78.0%
associate-/l*98.8%
associate-/r*99.9%
associate-/r/99.9%
div-sub100.0%
*-inverses100.0%
Simplified100.0%
Final simplification100.0%
(FPCore (x y) :precision binary64 (if (or (<= x -1.8e-146) (not (<= x 7.2e-140))) (* 2.0 (/ y (- 1.0 (/ y x)))) (* x -2.0)))
double code(double x, double y) {
double tmp;
if ((x <= -1.8e-146) || !(x <= 7.2e-140)) {
tmp = 2.0 * (y / (1.0 - (y / x)));
} else {
tmp = x * -2.0;
}
return tmp;
}
real(8) function code(x, y)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8) :: tmp
if ((x <= (-1.8d-146)) .or. (.not. (x <= 7.2d-140))) then
tmp = 2.0d0 * (y / (1.0d0 - (y / x)))
else
tmp = x * (-2.0d0)
end if
code = tmp
end function
public static double code(double x, double y) {
double tmp;
if ((x <= -1.8e-146) || !(x <= 7.2e-140)) {
tmp = 2.0 * (y / (1.0 - (y / x)));
} else {
tmp = x * -2.0;
}
return tmp;
}
def code(x, y): tmp = 0 if (x <= -1.8e-146) or not (x <= 7.2e-140): tmp = 2.0 * (y / (1.0 - (y / x))) else: tmp = x * -2.0 return tmp
function code(x, y) tmp = 0.0 if ((x <= -1.8e-146) || !(x <= 7.2e-140)) tmp = Float64(2.0 * Float64(y / Float64(1.0 - Float64(y / x)))); else tmp = Float64(x * -2.0); end return tmp end
function tmp_2 = code(x, y) tmp = 0.0; if ((x <= -1.8e-146) || ~((x <= 7.2e-140))) tmp = 2.0 * (y / (1.0 - (y / x))); else tmp = x * -2.0; end tmp_2 = tmp; end
code[x_, y_] := If[Or[LessEqual[x, -1.8e-146], N[Not[LessEqual[x, 7.2e-140]], $MachinePrecision]], N[(2.0 * N[(y / N[(1.0 - N[(y / x), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(x * -2.0), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq -1.8 \cdot 10^{-146} \lor \neg \left(x \leq 7.2 \cdot 10^{-140}\right):\\
\;\;\;\;2 \cdot \frac{y}{1 - \frac{y}{x}}\\
\mathbf{else}:\\
\;\;\;\;x \cdot -2\\
\end{array}
\end{array}
if x < -1.79999999999999989e-146 or 7.2000000000000001e-140 < x Initial program 82.4%
*-commutative82.4%
associate-/l*97.0%
associate-/r*97.5%
associate-/r/97.5%
div-sub97.5%
*-inverses97.5%
Simplified97.5%
if -1.79999999999999989e-146 < x < 7.2000000000000001e-140Initial program 70.9%
associate-/l*99.9%
Simplified99.9%
Taylor expanded in x around 0 90.7%
*-commutative90.7%
Simplified90.7%
Final simplification95.9%
(FPCore (x y) :precision binary64 (if (<= x -5e-147) (* y (/ (+ x x) (- x y))) (if (<= x 2.5e-139) (* x -2.0) (* 2.0 (/ y (- 1.0 (/ y x)))))))
double code(double x, double y) {
double tmp;
if (x <= -5e-147) {
tmp = y * ((x + x) / (x - y));
} else if (x <= 2.5e-139) {
tmp = x * -2.0;
} else {
tmp = 2.0 * (y / (1.0 - (y / x)));
}
return tmp;
}
real(8) function code(x, y)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8) :: tmp
if (x <= (-5d-147)) then
tmp = y * ((x + x) / (x - y))
else if (x <= 2.5d-139) then
tmp = x * (-2.0d0)
else
tmp = 2.0d0 * (y / (1.0d0 - (y / x)))
end if
code = tmp
end function
public static double code(double x, double y) {
double tmp;
if (x <= -5e-147) {
tmp = y * ((x + x) / (x - y));
} else if (x <= 2.5e-139) {
tmp = x * -2.0;
} else {
tmp = 2.0 * (y / (1.0 - (y / x)));
}
return tmp;
}
def code(x, y): tmp = 0 if x <= -5e-147: tmp = y * ((x + x) / (x - y)) elif x <= 2.5e-139: tmp = x * -2.0 else: tmp = 2.0 * (y / (1.0 - (y / x))) return tmp
function code(x, y) tmp = 0.0 if (x <= -5e-147) tmp = Float64(y * Float64(Float64(x + x) / Float64(x - y))); elseif (x <= 2.5e-139) tmp = Float64(x * -2.0); else tmp = Float64(2.0 * Float64(y / Float64(1.0 - Float64(y / x)))); end return tmp end
function tmp_2 = code(x, y) tmp = 0.0; if (x <= -5e-147) tmp = y * ((x + x) / (x - y)); elseif (x <= 2.5e-139) tmp = x * -2.0; else tmp = 2.0 * (y / (1.0 - (y / x))); end tmp_2 = tmp; end
code[x_, y_] := If[LessEqual[x, -5e-147], N[(y * N[(N[(x + x), $MachinePrecision] / N[(x - y), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[x, 2.5e-139], N[(x * -2.0), $MachinePrecision], N[(2.0 * N[(y / N[(1.0 - N[(y / x), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq -5 \cdot 10^{-147}:\\
\;\;\;\;y \cdot \frac{x + x}{x - y}\\
\mathbf{elif}\;x \leq 2.5 \cdot 10^{-139}:\\
\;\;\;\;x \cdot -2\\
\mathbf{else}:\\
\;\;\;\;2 \cdot \frac{y}{1 - \frac{y}{x}}\\
\end{array}
\end{array}
if x < -5.00000000000000013e-147Initial program 85.1%
associate-/l*86.0%
Simplified86.0%
associate-/r/98.1%
add-log-exp5.6%
exp-lft-sqr5.6%
log-prod5.7%
add-log-exp9.8%
add-log-exp98.1%
Applied egg-rr98.1%
if -5.00000000000000013e-147 < x < 2.50000000000000017e-139Initial program 70.9%
associate-/l*99.9%
Simplified99.9%
Taylor expanded in x around 0 90.7%
*-commutative90.7%
Simplified90.7%
if 2.50000000000000017e-139 < x Initial program 79.4%
*-commutative79.4%
associate-/l*96.8%
associate-/r*97.8%
associate-/r/97.8%
div-sub97.9%
*-inverses97.9%
Simplified97.9%
Final simplification96.2%
(FPCore (x y) :precision binary64 (if (<= y -1.08e+18) (* x -2.0) (if (<= y 8.2e-20) (* y 2.0) (* x -2.0))))
double code(double x, double y) {
double tmp;
if (y <= -1.08e+18) {
tmp = x * -2.0;
} else if (y <= 8.2e-20) {
tmp = y * 2.0;
} else {
tmp = x * -2.0;
}
return tmp;
}
real(8) function code(x, y)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8) :: tmp
if (y <= (-1.08d+18)) then
tmp = x * (-2.0d0)
else if (y <= 8.2d-20) then
tmp = y * 2.0d0
else
tmp = x * (-2.0d0)
end if
code = tmp
end function
public static double code(double x, double y) {
double tmp;
if (y <= -1.08e+18) {
tmp = x * -2.0;
} else if (y <= 8.2e-20) {
tmp = y * 2.0;
} else {
tmp = x * -2.0;
}
return tmp;
}
def code(x, y): tmp = 0 if y <= -1.08e+18: tmp = x * -2.0 elif y <= 8.2e-20: tmp = y * 2.0 else: tmp = x * -2.0 return tmp
function code(x, y) tmp = 0.0 if (y <= -1.08e+18) tmp = Float64(x * -2.0); elseif (y <= 8.2e-20) tmp = Float64(y * 2.0); else tmp = Float64(x * -2.0); end return tmp end
function tmp_2 = code(x, y) tmp = 0.0; if (y <= -1.08e+18) tmp = x * -2.0; elseif (y <= 8.2e-20) tmp = y * 2.0; else tmp = x * -2.0; end tmp_2 = tmp; end
code[x_, y_] := If[LessEqual[y, -1.08e+18], N[(x * -2.0), $MachinePrecision], If[LessEqual[y, 8.2e-20], N[(y * 2.0), $MachinePrecision], N[(x * -2.0), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;y \leq -1.08 \cdot 10^{+18}:\\
\;\;\;\;x \cdot -2\\
\mathbf{elif}\;y \leq 8.2 \cdot 10^{-20}:\\
\;\;\;\;y \cdot 2\\
\mathbf{else}:\\
\;\;\;\;x \cdot -2\\
\end{array}
\end{array}
if y < -1.08e18 or 8.2000000000000002e-20 < y Initial program 77.1%
associate-/l*99.9%
Simplified99.9%
Taylor expanded in x around 0 79.0%
*-commutative79.0%
Simplified79.0%
if -1.08e18 < y < 8.2000000000000002e-20Initial program 82.0%
*-commutative82.0%
associate-/l*99.2%
associate-/r*99.9%
associate-/r/99.9%
div-sub100.0%
*-inverses100.0%
Simplified100.0%
Taylor expanded in y around 0 80.8%
Final simplification80.0%
(FPCore (x y) :precision binary64 (* x -2.0))
double code(double x, double y) {
return x * -2.0;
}
real(8) function code(x, y)
real(8), intent (in) :: x
real(8), intent (in) :: y
code = x * (-2.0d0)
end function
public static double code(double x, double y) {
return x * -2.0;
}
def code(x, y): return x * -2.0
function code(x, y) return Float64(x * -2.0) end
function tmp = code(x, y) tmp = x * -2.0; end
code[x_, y_] := N[(x * -2.0), $MachinePrecision]
\begin{array}{l}
\\
x \cdot -2
\end{array}
Initial program 79.6%
associate-/l*87.8%
Simplified87.8%
Taylor expanded in x around 0 48.5%
*-commutative48.5%
Simplified48.5%
Final simplification48.5%
(FPCore (x y)
:precision binary64
(let* ((t_0 (* (/ (* 2.0 x) (- x y)) y)))
(if (< x -1.7210442634149447e+81)
t_0
(if (< x 83645045635564430.0) (/ (* x 2.0) (/ (- x y) y)) t_0))))
double code(double x, double y) {
double t_0 = ((2.0 * x) / (x - y)) * y;
double tmp;
if (x < -1.7210442634149447e+81) {
tmp = t_0;
} else if (x < 83645045635564430.0) {
tmp = (x * 2.0) / ((x - y) / y);
} else {
tmp = t_0;
}
return tmp;
}
real(8) function code(x, y)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8) :: t_0
real(8) :: tmp
t_0 = ((2.0d0 * x) / (x - y)) * y
if (x < (-1.7210442634149447d+81)) then
tmp = t_0
else if (x < 83645045635564430.0d0) then
tmp = (x * 2.0d0) / ((x - y) / y)
else
tmp = t_0
end if
code = tmp
end function
public static double code(double x, double y) {
double t_0 = ((2.0 * x) / (x - y)) * y;
double tmp;
if (x < -1.7210442634149447e+81) {
tmp = t_0;
} else if (x < 83645045635564430.0) {
tmp = (x * 2.0) / ((x - y) / y);
} else {
tmp = t_0;
}
return tmp;
}
def code(x, y): t_0 = ((2.0 * x) / (x - y)) * y tmp = 0 if x < -1.7210442634149447e+81: tmp = t_0 elif x < 83645045635564430.0: tmp = (x * 2.0) / ((x - y) / y) else: tmp = t_0 return tmp
function code(x, y) t_0 = Float64(Float64(Float64(2.0 * x) / Float64(x - y)) * y) tmp = 0.0 if (x < -1.7210442634149447e+81) tmp = t_0; elseif (x < 83645045635564430.0) tmp = Float64(Float64(x * 2.0) / Float64(Float64(x - y) / y)); else tmp = t_0; end return tmp end
function tmp_2 = code(x, y) t_0 = ((2.0 * x) / (x - y)) * y; tmp = 0.0; if (x < -1.7210442634149447e+81) tmp = t_0; elseif (x < 83645045635564430.0) tmp = (x * 2.0) / ((x - y) / y); else tmp = t_0; end tmp_2 = tmp; end
code[x_, y_] := Block[{t$95$0 = N[(N[(N[(2.0 * x), $MachinePrecision] / N[(x - y), $MachinePrecision]), $MachinePrecision] * y), $MachinePrecision]}, If[Less[x, -1.7210442634149447e+81], t$95$0, If[Less[x, 83645045635564430.0], N[(N[(x * 2.0), $MachinePrecision] / N[(N[(x - y), $MachinePrecision] / y), $MachinePrecision]), $MachinePrecision], t$95$0]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \frac{2 \cdot x}{x - y} \cdot y\\
\mathbf{if}\;x < -1.7210442634149447 \cdot 10^{+81}:\\
\;\;\;\;t_0\\
\mathbf{elif}\;x < 83645045635564430:\\
\;\;\;\;\frac{x \cdot 2}{\frac{x - y}{y}}\\
\mathbf{else}:\\
\;\;\;\;t_0\\
\end{array}
\end{array}
herbie shell --seed 2023293
(FPCore (x y)
:name "Linear.Projection:perspective from linear-1.19.1.3, B"
:precision binary64
:herbie-target
(if (< x -1.7210442634149447e+81) (* (/ (* 2.0 x) (- x y)) y) (if (< x 83645045635564430.0) (/ (* x 2.0) (/ (- x y) y)) (* (/ (* 2.0 x) (- x y)) y)))
(/ (* (* x 2.0) y) (- x y)))