
(FPCore (x y) :precision binary64 (/ (+ x y) (- x y)))
double code(double x, double y) {
return (x + y) / (x - y);
}
real(8) function code(x, y)
real(8), intent (in) :: x
real(8), intent (in) :: y
code = (x + y) / (x - y)
end function
public static double code(double x, double y) {
return (x + y) / (x - y);
}
def code(x, y): return (x + y) / (x - y)
function code(x, y) return Float64(Float64(x + y) / Float64(x - y)) end
function tmp = code(x, y) tmp = (x + y) / (x - y); end
code[x_, y_] := N[(N[(x + y), $MachinePrecision] / N[(x - y), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{x + y}{x - y}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 4 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x y) :precision binary64 (/ (+ x y) (- x y)))
double code(double x, double y) {
return (x + y) / (x - y);
}
real(8) function code(x, y)
real(8), intent (in) :: x
real(8), intent (in) :: y
code = (x + y) / (x - y)
end function
public static double code(double x, double y) {
return (x + y) / (x - y);
}
def code(x, y): return (x + y) / (x - y)
function code(x, y) return Float64(Float64(x + y) / Float64(x - y)) end
function tmp = code(x, y) tmp = (x + y) / (x - y); end
code[x_, y_] := N[(N[(x + y), $MachinePrecision] / N[(x - y), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{x + y}{x - y}
\end{array}
(FPCore (x y) :precision binary64 (/ (+ x y) (- x y)))
double code(double x, double y) {
return (x + y) / (x - y);
}
real(8) function code(x, y)
real(8), intent (in) :: x
real(8), intent (in) :: y
code = (x + y) / (x - y)
end function
public static double code(double x, double y) {
return (x + y) / (x - y);
}
def code(x, y): return (x + y) / (x - y)
function code(x, y) return Float64(Float64(x + y) / Float64(x - y)) end
function tmp = code(x, y) tmp = (x + y) / (x - y); end
code[x_, y_] := N[(N[(x + y), $MachinePrecision] / N[(x - y), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{x + y}{x - y}
\end{array}
(FPCore (x y)
:precision binary64
(if (or (<= y -8e+115)
(and (not (<= y -4.7e+73))
(or (<= y -3.05e-124) (not (<= y 1.4e-6)))))
(+ (* -2.0 (/ x y)) -1.0)
1.0))
double code(double x, double y) {
double tmp;
if ((y <= -8e+115) || (!(y <= -4.7e+73) && ((y <= -3.05e-124) || !(y <= 1.4e-6)))) {
tmp = (-2.0 * (x / y)) + -1.0;
} else {
tmp = 1.0;
}
return tmp;
}
real(8) function code(x, y)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8) :: tmp
if ((y <= (-8d+115)) .or. (.not. (y <= (-4.7d+73))) .and. (y <= (-3.05d-124)) .or. (.not. (y <= 1.4d-6))) then
tmp = ((-2.0d0) * (x / y)) + (-1.0d0)
else
tmp = 1.0d0
end if
code = tmp
end function
public static double code(double x, double y) {
double tmp;
if ((y <= -8e+115) || (!(y <= -4.7e+73) && ((y <= -3.05e-124) || !(y <= 1.4e-6)))) {
tmp = (-2.0 * (x / y)) + -1.0;
} else {
tmp = 1.0;
}
return tmp;
}
def code(x, y): tmp = 0 if (y <= -8e+115) or (not (y <= -4.7e+73) and ((y <= -3.05e-124) or not (y <= 1.4e-6))): tmp = (-2.0 * (x / y)) + -1.0 else: tmp = 1.0 return tmp
function code(x, y) tmp = 0.0 if ((y <= -8e+115) || (!(y <= -4.7e+73) && ((y <= -3.05e-124) || !(y <= 1.4e-6)))) tmp = Float64(Float64(-2.0 * Float64(x / y)) + -1.0); else tmp = 1.0; end return tmp end
function tmp_2 = code(x, y) tmp = 0.0; if ((y <= -8e+115) || (~((y <= -4.7e+73)) && ((y <= -3.05e-124) || ~((y <= 1.4e-6))))) tmp = (-2.0 * (x / y)) + -1.0; else tmp = 1.0; end tmp_2 = tmp; end
code[x_, y_] := If[Or[LessEqual[y, -8e+115], And[N[Not[LessEqual[y, -4.7e+73]], $MachinePrecision], Or[LessEqual[y, -3.05e-124], N[Not[LessEqual[y, 1.4e-6]], $MachinePrecision]]]], N[(N[(-2.0 * N[(x / y), $MachinePrecision]), $MachinePrecision] + -1.0), $MachinePrecision], 1.0]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;y \leq -8 \cdot 10^{+115} \lor \neg \left(y \leq -4.7 \cdot 10^{+73}\right) \land \left(y \leq -3.05 \cdot 10^{-124} \lor \neg \left(y \leq 1.4 \cdot 10^{-6}\right)\right):\\
\;\;\;\;-2 \cdot \frac{x}{y} + -1\\
\mathbf{else}:\\
\;\;\;\;1\\
\end{array}
\end{array}
(FPCore (x y)
:precision binary64
(if (<= y -8.5e+115)
-1.0
(if (<= y -5e+90)
1.0
(if (<= y -200000.0)
-1.0
(if (<= y -5e-59)
1.0
(if (<= y -8.4e-101) -1.0 (if (<= y 7e-5) 1.0 -1.0)))))))
double code(double x, double y) {
double tmp;
if (y <= -8.5e+115) {
tmp = -1.0;
} else if (y <= -5e+90) {
tmp = 1.0;
} else if (y <= -200000.0) {
tmp = -1.0;
} else if (y <= -5e-59) {
tmp = 1.0;
} else if (y <= -8.4e-101) {
tmp = -1.0;
} else if (y <= 7e-5) {
tmp = 1.0;
} else {
tmp = -1.0;
}
return tmp;
}
real(8) function code(x, y)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8) :: tmp
if (y <= (-8.5d+115)) then
tmp = -1.0d0
else if (y <= (-5d+90)) then
tmp = 1.0d0
else if (y <= (-200000.0d0)) then
tmp = -1.0d0
else if (y <= (-5d-59)) then
tmp = 1.0d0
else if (y <= (-8.4d-101)) then
tmp = -1.0d0
else if (y <= 7d-5) then
tmp = 1.0d0
else
tmp = -1.0d0
end if
code = tmp
end function
public static double code(double x, double y) {
double tmp;
if (y <= -8.5e+115) {
tmp = -1.0;
} else if (y <= -5e+90) {
tmp = 1.0;
} else if (y <= -200000.0) {
tmp = -1.0;
} else if (y <= -5e-59) {
tmp = 1.0;
} else if (y <= -8.4e-101) {
tmp = -1.0;
} else if (y <= 7e-5) {
tmp = 1.0;
} else {
tmp = -1.0;
}
return tmp;
}
def code(x, y): tmp = 0 if y <= -8.5e+115: tmp = -1.0 elif y <= -5e+90: tmp = 1.0 elif y <= -200000.0: tmp = -1.0 elif y <= -5e-59: tmp = 1.0 elif y <= -8.4e-101: tmp = -1.0 elif y <= 7e-5: tmp = 1.0 else: tmp = -1.0 return tmp
function code(x, y) tmp = 0.0 if (y <= -8.5e+115) tmp = -1.0; elseif (y <= -5e+90) tmp = 1.0; elseif (y <= -200000.0) tmp = -1.0; elseif (y <= -5e-59) tmp = 1.0; elseif (y <= -8.4e-101) tmp = -1.0; elseif (y <= 7e-5) tmp = 1.0; else tmp = -1.0; end return tmp end
function tmp_2 = code(x, y) tmp = 0.0; if (y <= -8.5e+115) tmp = -1.0; elseif (y <= -5e+90) tmp = 1.0; elseif (y <= -200000.0) tmp = -1.0; elseif (y <= -5e-59) tmp = 1.0; elseif (y <= -8.4e-101) tmp = -1.0; elseif (y <= 7e-5) tmp = 1.0; else tmp = -1.0; end tmp_2 = tmp; end
code[x_, y_] := If[LessEqual[y, -8.5e+115], -1.0, If[LessEqual[y, -5e+90], 1.0, If[LessEqual[y, -200000.0], -1.0, If[LessEqual[y, -5e-59], 1.0, If[LessEqual[y, -8.4e-101], -1.0, If[LessEqual[y, 7e-5], 1.0, -1.0]]]]]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;y \leq -8.5 \cdot 10^{+115}:\\
\;\;\;\;-1\\
\mathbf{elif}\;y \leq -5 \cdot 10^{+90}:\\
\;\;\;\;1\\
\mathbf{elif}\;y \leq -200000:\\
\;\;\;\;-1\\
\mathbf{elif}\;y \leq -5 \cdot 10^{-59}:\\
\;\;\;\;1\\
\mathbf{elif}\;y \leq -8.4 \cdot 10^{-101}:\\
\;\;\;\;-1\\
\mathbf{elif}\;y \leq 7 \cdot 10^{-5}:\\
\;\;\;\;1\\
\mathbf{else}:\\
\;\;\;\;-1\\
\end{array}
\end{array}
(FPCore (x y) :precision binary64 -1.0)
double code(double x, double y) {
return -1.0;
}
real(8) function code(x, y)
real(8), intent (in) :: x
real(8), intent (in) :: y
code = -1.0d0
end function
public static double code(double x, double y) {
return -1.0;
}
def code(x, y): return -1.0
function code(x, y) return -1.0 end
function tmp = code(x, y) tmp = -1.0; end
code[x_, y_] := -1.0
\begin{array}{l}
\\
-1
\end{array}
(FPCore (x y) :precision binary64 (/ 1.0 (- (/ x (+ x y)) (/ y (+ x y)))))
double code(double x, double y) {
return 1.0 / ((x / (x + y)) - (y / (x + y)));
}
real(8) function code(x, y)
real(8), intent (in) :: x
real(8), intent (in) :: y
code = 1.0d0 / ((x / (x + y)) - (y / (x + y)))
end function
public static double code(double x, double y) {
return 1.0 / ((x / (x + y)) - (y / (x + y)));
}
def code(x, y): return 1.0 / ((x / (x + y)) - (y / (x + y)))
function code(x, y) return Float64(1.0 / Float64(Float64(x / Float64(x + y)) - Float64(y / Float64(x + y)))) end
function tmp = code(x, y) tmp = 1.0 / ((x / (x + y)) - (y / (x + y))); end
code[x_, y_] := N[(1.0 / N[(N[(x / N[(x + y), $MachinePrecision]), $MachinePrecision] - N[(y / N[(x + y), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{1}{\frac{x}{x + y} - \frac{y}{x + y}}
\end{array}
herbie shell --seed 2024008
(FPCore (x y)
:name "Linear.Projection:perspective from linear-1.19.1.3, A"
:precision binary64
:herbie-target
(/ 1.0 (- (/ x (+ x y)) (/ y (+ x y))))
(/ (+ x y) (- x y)))