
(FPCore (x y z) :precision binary64 (+ (* x y) (* (- 1.0 x) z)))
double code(double x, double y, double z) {
return (x * y) + ((1.0 - x) * z);
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
code = (x * y) + ((1.0d0 - x) * z)
end function
public static double code(double x, double y, double z) {
return (x * y) + ((1.0 - x) * z);
}
def code(x, y, z): return (x * y) + ((1.0 - x) * z)
function code(x, y, z) return Float64(Float64(x * y) + Float64(Float64(1.0 - x) * z)) end
function tmp = code(x, y, z) tmp = (x * y) + ((1.0 - x) * z); end
code[x_, y_, z_] := N[(N[(x * y), $MachinePrecision] + N[(N[(1.0 - x), $MachinePrecision] * z), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
x \cdot y + \left(1 - x\right) \cdot z
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 7 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x y z) :precision binary64 (+ (* x y) (* (- 1.0 x) z)))
double code(double x, double y, double z) {
return (x * y) + ((1.0 - x) * z);
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
code = (x * y) + ((1.0d0 - x) * z)
end function
public static double code(double x, double y, double z) {
return (x * y) + ((1.0 - x) * z);
}
def code(x, y, z): return (x * y) + ((1.0 - x) * z)
function code(x, y, z) return Float64(Float64(x * y) + Float64(Float64(1.0 - x) * z)) end
function tmp = code(x, y, z) tmp = (x * y) + ((1.0 - x) * z); end
code[x_, y_, z_] := N[(N[(x * y), $MachinePrecision] + N[(N[(1.0 - x), $MachinePrecision] * z), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
x \cdot y + \left(1 - x\right) \cdot z
\end{array}
(FPCore (x y z) :precision binary64 (fma x (- y z) z))
double code(double x, double y, double z) {
return fma(x, (y - z), z);
}
function code(x, y, z) return fma(x, Float64(y - z), z) end
code[x_, y_, z_] := N[(x * N[(y - z), $MachinePrecision] + z), $MachinePrecision]
\begin{array}{l}
\\
\mathsf{fma}\left(x, y - z, z\right)
\end{array}
(FPCore (x y z)
:precision binary64
(if (<= x -9e-159)
(* x y)
(if (<= x 2.75e-102)
z
(if (or (<= x 2.4e+52) (and (not (<= x 6.6e+209)) (<= x 4.5e+284)))
(* x y)
(* z (- x))))))
double code(double x, double y, double z) {
double tmp;
if (x <= -9e-159) {
tmp = x * y;
} else if (x <= 2.75e-102) {
tmp = z;
} else if ((x <= 2.4e+52) || (!(x <= 6.6e+209) && (x <= 4.5e+284))) {
tmp = x * y;
} else {
tmp = z * -x;
}
return tmp;
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
real(8) :: tmp
if (x <= (-9d-159)) then
tmp = x * y
else if (x <= 2.75d-102) then
tmp = z
else if ((x <= 2.4d+52) .or. (.not. (x <= 6.6d+209)) .and. (x <= 4.5d+284)) then
tmp = x * y
else
tmp = z * -x
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double tmp;
if (x <= -9e-159) {
tmp = x * y;
} else if (x <= 2.75e-102) {
tmp = z;
} else if ((x <= 2.4e+52) || (!(x <= 6.6e+209) && (x <= 4.5e+284))) {
tmp = x * y;
} else {
tmp = z * -x;
}
return tmp;
}
def code(x, y, z): tmp = 0 if x <= -9e-159: tmp = x * y elif x <= 2.75e-102: tmp = z elif (x <= 2.4e+52) or (not (x <= 6.6e+209) and (x <= 4.5e+284)): tmp = x * y else: tmp = z * -x return tmp
function code(x, y, z) tmp = 0.0 if (x <= -9e-159) tmp = Float64(x * y); elseif (x <= 2.75e-102) tmp = z; elseif ((x <= 2.4e+52) || (!(x <= 6.6e+209) && (x <= 4.5e+284))) tmp = Float64(x * y); else tmp = Float64(z * Float64(-x)); end return tmp end
function tmp_2 = code(x, y, z) tmp = 0.0; if (x <= -9e-159) tmp = x * y; elseif (x <= 2.75e-102) tmp = z; elseif ((x <= 2.4e+52) || (~((x <= 6.6e+209)) && (x <= 4.5e+284))) tmp = x * y; else tmp = z * -x; end tmp_2 = tmp; end
code[x_, y_, z_] := If[LessEqual[x, -9e-159], N[(x * y), $MachinePrecision], If[LessEqual[x, 2.75e-102], z, If[Or[LessEqual[x, 2.4e+52], And[N[Not[LessEqual[x, 6.6e+209]], $MachinePrecision], LessEqual[x, 4.5e+284]]], N[(x * y), $MachinePrecision], N[(z * (-x)), $MachinePrecision]]]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq -9 \cdot 10^{-159}:\\
\;\;\;\;x \cdot y\\
\mathbf{elif}\;x \leq 2.75 \cdot 10^{-102}:\\
\;\;\;\;z\\
\mathbf{elif}\;x \leq 2.4 \cdot 10^{+52} \lor \neg \left(x \leq 6.6 \cdot 10^{+209}\right) \land x \leq 4.5 \cdot 10^{+284}:\\
\;\;\;\;x \cdot y\\
\mathbf{else}:\\
\;\;\;\;z \cdot \left(-x\right)\\
\end{array}
\end{array}
(FPCore (x y z) :precision binary64 (if (or (<= z -7.6e+43) (not (<= z 10500000000.0))) (- z (* x z)) (+ z (* x y))))
double code(double x, double y, double z) {
double tmp;
if ((z <= -7.6e+43) || !(z <= 10500000000.0)) {
tmp = z - (x * z);
} else {
tmp = z + (x * y);
}
return tmp;
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
real(8) :: tmp
if ((z <= (-7.6d+43)) .or. (.not. (z <= 10500000000.0d0))) then
tmp = z - (x * z)
else
tmp = z + (x * y)
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double tmp;
if ((z <= -7.6e+43) || !(z <= 10500000000.0)) {
tmp = z - (x * z);
} else {
tmp = z + (x * y);
}
return tmp;
}
def code(x, y, z): tmp = 0 if (z <= -7.6e+43) or not (z <= 10500000000.0): tmp = z - (x * z) else: tmp = z + (x * y) return tmp
function code(x, y, z) tmp = 0.0 if ((z <= -7.6e+43) || !(z <= 10500000000.0)) tmp = Float64(z - Float64(x * z)); else tmp = Float64(z + Float64(x * y)); end return tmp end
function tmp_2 = code(x, y, z) tmp = 0.0; if ((z <= -7.6e+43) || ~((z <= 10500000000.0))) tmp = z - (x * z); else tmp = z + (x * y); end tmp_2 = tmp; end
code[x_, y_, z_] := If[Or[LessEqual[z, -7.6e+43], N[Not[LessEqual[z, 10500000000.0]], $MachinePrecision]], N[(z - N[(x * z), $MachinePrecision]), $MachinePrecision], N[(z + N[(x * y), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;z \leq -7.6 \cdot 10^{+43} \lor \neg \left(z \leq 10500000000\right):\\
\;\;\;\;z - x \cdot z\\
\mathbf{else}:\\
\;\;\;\;z + x \cdot y\\
\end{array}
\end{array}
(FPCore (x y z) :precision binary64 (if (or (<= x -4.6e-159) (not (<= x 2.7e-102))) (* x y) z))
double code(double x, double y, double z) {
double tmp;
if ((x <= -4.6e-159) || !(x <= 2.7e-102)) {
tmp = x * y;
} else {
tmp = z;
}
return tmp;
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
real(8) :: tmp
if ((x <= (-4.6d-159)) .or. (.not. (x <= 2.7d-102))) then
tmp = x * y
else
tmp = z
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double tmp;
if ((x <= -4.6e-159) || !(x <= 2.7e-102)) {
tmp = x * y;
} else {
tmp = z;
}
return tmp;
}
def code(x, y, z): tmp = 0 if (x <= -4.6e-159) or not (x <= 2.7e-102): tmp = x * y else: tmp = z return tmp
function code(x, y, z) tmp = 0.0 if ((x <= -4.6e-159) || !(x <= 2.7e-102)) tmp = Float64(x * y); else tmp = z; end return tmp end
function tmp_2 = code(x, y, z) tmp = 0.0; if ((x <= -4.6e-159) || ~((x <= 2.7e-102))) tmp = x * y; else tmp = z; end tmp_2 = tmp; end
code[x_, y_, z_] := If[Or[LessEqual[x, -4.6e-159], N[Not[LessEqual[x, 2.7e-102]], $MachinePrecision]], N[(x * y), $MachinePrecision], z]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq -4.6 \cdot 10^{-159} \lor \neg \left(x \leq 2.7 \cdot 10^{-102}\right):\\
\;\;\;\;x \cdot y\\
\mathbf{else}:\\
\;\;\;\;z\\
\end{array}
\end{array}
(FPCore (x y z) :precision binary64 (+ z (* x (- y z))))
double code(double x, double y, double z) {
return z + (x * (y - z));
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
code = z + (x * (y - z))
end function
public static double code(double x, double y, double z) {
return z + (x * (y - z));
}
def code(x, y, z): return z + (x * (y - z))
function code(x, y, z) return Float64(z + Float64(x * Float64(y - z))) end
function tmp = code(x, y, z) tmp = z + (x * (y - z)); end
code[x_, y_, z_] := N[(z + N[(x * N[(y - z), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
z + x \cdot \left(y - z\right)
\end{array}
(FPCore (x y z) :precision binary64 (+ z (* x y)))
double code(double x, double y, double z) {
return z + (x * y);
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
code = z + (x * y)
end function
public static double code(double x, double y, double z) {
return z + (x * y);
}
def code(x, y, z): return z + (x * y)
function code(x, y, z) return Float64(z + Float64(x * y)) end
function tmp = code(x, y, z) tmp = z + (x * y); end
code[x_, y_, z_] := N[(z + N[(x * y), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
z + x \cdot y
\end{array}
(FPCore (x y z) :precision binary64 z)
double code(double x, double y, double z) {
return z;
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
code = z
end function
public static double code(double x, double y, double z) {
return z;
}
def code(x, y, z): return z
function code(x, y, z) return z end
function tmp = code(x, y, z) tmp = z; end
code[x_, y_, z_] := z
\begin{array}{l}
\\
z
\end{array}
herbie shell --seed 2023350
(FPCore (x y z)
:name "Diagrams.Backend.Rasterific:$crender from diagrams-rasterific-1.3.1.3"
:precision binary64
(+ (* x y) (* (- 1.0 x) z)))