
(FPCore (x y z) :precision binary64 (+ (* (- 1.0 x) y) (* x z)))
double code(double x, double y, double z) {
return ((1.0 - x) * y) + (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 = ((1.0d0 - x) * y) + (x * z)
end function
public static double code(double x, double y, double z) {
return ((1.0 - x) * y) + (x * z);
}
def code(x, y, z): return ((1.0 - x) * y) + (x * z)
function code(x, y, z) return Float64(Float64(Float64(1.0 - x) * y) + Float64(x * z)) end
function tmp = code(x, y, z) tmp = ((1.0 - x) * y) + (x * z); end
code[x_, y_, z_] := N[(N[(N[(1.0 - x), $MachinePrecision] * y), $MachinePrecision] + N[(x * z), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\left(1 - x\right) \cdot y + x \cdot z
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 8 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x y z) :precision binary64 (+ (* (- 1.0 x) y) (* x z)))
double code(double x, double y, double z) {
return ((1.0 - x) * y) + (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 = ((1.0d0 - x) * y) + (x * z)
end function
public static double code(double x, double y, double z) {
return ((1.0 - x) * y) + (x * z);
}
def code(x, y, z): return ((1.0 - x) * y) + (x * z)
function code(x, y, z) return Float64(Float64(Float64(1.0 - x) * y) + Float64(x * z)) end
function tmp = code(x, y, z) tmp = ((1.0 - x) * y) + (x * z); end
code[x_, y_, z_] := N[(N[(N[(1.0 - x), $MachinePrecision] * y), $MachinePrecision] + N[(x * z), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\left(1 - x\right) \cdot y + x \cdot z
\end{array}
(FPCore (x y z) :precision binary64 (fma x (- z y) y))
double code(double x, double y, double z) {
return fma(x, (z - y), y);
}
function code(x, y, z) return fma(x, Float64(z - y), y) end
code[x_, y_, z_] := N[(x * N[(z - y), $MachinePrecision] + y), $MachinePrecision]
\begin{array}{l}
\\
\mathsf{fma}\left(x, z - y, y\right)
\end{array}
(FPCore (x y z)
:precision binary64
(let* ((t_0 (* x (- y))))
(if (<= x -8.5e+98)
(* x z)
(if (<= x -3.4e+45)
t_0
(if (<= x -1.55e-124)
(* x z)
(if (<= x 3.3e-191)
y
(if (<= x 3e-63)
(* x z)
(if (<= x 1.32e-13)
y
(if (or (<= x 7400000000000.0)
(and (not (<= x 2.3e+80)) (<= x 1.45e+174)))
(* x z)
t_0)))))))))
double code(double x, double y, double z) {
double t_0 = x * -y;
double tmp;
if (x <= -8.5e+98) {
tmp = x * z;
} else if (x <= -3.4e+45) {
tmp = t_0;
} else if (x <= -1.55e-124) {
tmp = x * z;
} else if (x <= 3.3e-191) {
tmp = y;
} else if (x <= 3e-63) {
tmp = x * z;
} else if (x <= 1.32e-13) {
tmp = y;
} else if ((x <= 7400000000000.0) || (!(x <= 2.3e+80) && (x <= 1.45e+174))) {
tmp = x * z;
} else {
tmp = t_0;
}
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) :: t_0
real(8) :: tmp
t_0 = x * -y
if (x <= (-8.5d+98)) then
tmp = x * z
else if (x <= (-3.4d+45)) then
tmp = t_0
else if (x <= (-1.55d-124)) then
tmp = x * z
else if (x <= 3.3d-191) then
tmp = y
else if (x <= 3d-63) then
tmp = x * z
else if (x <= 1.32d-13) then
tmp = y
else if ((x <= 7400000000000.0d0) .or. (.not. (x <= 2.3d+80)) .and. (x <= 1.45d+174)) then
tmp = x * z
else
tmp = t_0
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double t_0 = x * -y;
double tmp;
if (x <= -8.5e+98) {
tmp = x * z;
} else if (x <= -3.4e+45) {
tmp = t_0;
} else if (x <= -1.55e-124) {
tmp = x * z;
} else if (x <= 3.3e-191) {
tmp = y;
} else if (x <= 3e-63) {
tmp = x * z;
} else if (x <= 1.32e-13) {
tmp = y;
} else if ((x <= 7400000000000.0) || (!(x <= 2.3e+80) && (x <= 1.45e+174))) {
tmp = x * z;
} else {
tmp = t_0;
}
return tmp;
}
def code(x, y, z): t_0 = x * -y tmp = 0 if x <= -8.5e+98: tmp = x * z elif x <= -3.4e+45: tmp = t_0 elif x <= -1.55e-124: tmp = x * z elif x <= 3.3e-191: tmp = y elif x <= 3e-63: tmp = x * z elif x <= 1.32e-13: tmp = y elif (x <= 7400000000000.0) or (not (x <= 2.3e+80) and (x <= 1.45e+174)): tmp = x * z else: tmp = t_0 return tmp
function code(x, y, z) t_0 = Float64(x * Float64(-y)) tmp = 0.0 if (x <= -8.5e+98) tmp = Float64(x * z); elseif (x <= -3.4e+45) tmp = t_0; elseif (x <= -1.55e-124) tmp = Float64(x * z); elseif (x <= 3.3e-191) tmp = y; elseif (x <= 3e-63) tmp = Float64(x * z); elseif (x <= 1.32e-13) tmp = y; elseif ((x <= 7400000000000.0) || (!(x <= 2.3e+80) && (x <= 1.45e+174))) tmp = Float64(x * z); else tmp = t_0; end return tmp end
function tmp_2 = code(x, y, z) t_0 = x * -y; tmp = 0.0; if (x <= -8.5e+98) tmp = x * z; elseif (x <= -3.4e+45) tmp = t_0; elseif (x <= -1.55e-124) tmp = x * z; elseif (x <= 3.3e-191) tmp = y; elseif (x <= 3e-63) tmp = x * z; elseif (x <= 1.32e-13) tmp = y; elseif ((x <= 7400000000000.0) || (~((x <= 2.3e+80)) && (x <= 1.45e+174))) tmp = x * z; else tmp = t_0; end tmp_2 = tmp; end
code[x_, y_, z_] := Block[{t$95$0 = N[(x * (-y)), $MachinePrecision]}, If[LessEqual[x, -8.5e+98], N[(x * z), $MachinePrecision], If[LessEqual[x, -3.4e+45], t$95$0, If[LessEqual[x, -1.55e-124], N[(x * z), $MachinePrecision], If[LessEqual[x, 3.3e-191], y, If[LessEqual[x, 3e-63], N[(x * z), $MachinePrecision], If[LessEqual[x, 1.32e-13], y, If[Or[LessEqual[x, 7400000000000.0], And[N[Not[LessEqual[x, 2.3e+80]], $MachinePrecision], LessEqual[x, 1.45e+174]]], N[(x * z), $MachinePrecision], t$95$0]]]]]]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := x \cdot \left(-y\right)\\
\mathbf{if}\;x \leq -8.5 \cdot 10^{+98}:\\
\;\;\;\;x \cdot z\\
\mathbf{elif}\;x \leq -3.4 \cdot 10^{+45}:\\
\;\;\;\;t_0\\
\mathbf{elif}\;x \leq -1.55 \cdot 10^{-124}:\\
\;\;\;\;x \cdot z\\
\mathbf{elif}\;x \leq 3.3 \cdot 10^{-191}:\\
\;\;\;\;y\\
\mathbf{elif}\;x \leq 3 \cdot 10^{-63}:\\
\;\;\;\;x \cdot z\\
\mathbf{elif}\;x \leq 1.32 \cdot 10^{-13}:\\
\;\;\;\;y\\
\mathbf{elif}\;x \leq 7400000000000 \lor \neg \left(x \leq 2.3 \cdot 10^{+80}\right) \land x \leq 1.45 \cdot 10^{+174}:\\
\;\;\;\;x \cdot z\\
\mathbf{else}:\\
\;\;\;\;t_0\\
\end{array}
\end{array}
(FPCore (x y z)
:precision binary64
(let* ((t_0 (* x (- z y))))
(if (<= x -2.7e-124)
t_0
(if (<= x 5.5e-191)
y
(if (<= x 3e-63) (* x z) (if (<= x 2.1e-13) y t_0))))))
double code(double x, double y, double z) {
double t_0 = x * (z - y);
double tmp;
if (x <= -2.7e-124) {
tmp = t_0;
} else if (x <= 5.5e-191) {
tmp = y;
} else if (x <= 3e-63) {
tmp = x * z;
} else if (x <= 2.1e-13) {
tmp = y;
} else {
tmp = t_0;
}
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) :: t_0
real(8) :: tmp
t_0 = x * (z - y)
if (x <= (-2.7d-124)) then
tmp = t_0
else if (x <= 5.5d-191) then
tmp = y
else if (x <= 3d-63) then
tmp = x * z
else if (x <= 2.1d-13) then
tmp = y
else
tmp = t_0
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double t_0 = x * (z - y);
double tmp;
if (x <= -2.7e-124) {
tmp = t_0;
} else if (x <= 5.5e-191) {
tmp = y;
} else if (x <= 3e-63) {
tmp = x * z;
} else if (x <= 2.1e-13) {
tmp = y;
} else {
tmp = t_0;
}
return tmp;
}
def code(x, y, z): t_0 = x * (z - y) tmp = 0 if x <= -2.7e-124: tmp = t_0 elif x <= 5.5e-191: tmp = y elif x <= 3e-63: tmp = x * z elif x <= 2.1e-13: tmp = y else: tmp = t_0 return tmp
function code(x, y, z) t_0 = Float64(x * Float64(z - y)) tmp = 0.0 if (x <= -2.7e-124) tmp = t_0; elseif (x <= 5.5e-191) tmp = y; elseif (x <= 3e-63) tmp = Float64(x * z); elseif (x <= 2.1e-13) tmp = y; else tmp = t_0; end return tmp end
function tmp_2 = code(x, y, z) t_0 = x * (z - y); tmp = 0.0; if (x <= -2.7e-124) tmp = t_0; elseif (x <= 5.5e-191) tmp = y; elseif (x <= 3e-63) tmp = x * z; elseif (x <= 2.1e-13) tmp = y; else tmp = t_0; end tmp_2 = tmp; end
code[x_, y_, z_] := Block[{t$95$0 = N[(x * N[(z - y), $MachinePrecision]), $MachinePrecision]}, If[LessEqual[x, -2.7e-124], t$95$0, If[LessEqual[x, 5.5e-191], y, If[LessEqual[x, 3e-63], N[(x * z), $MachinePrecision], If[LessEqual[x, 2.1e-13], y, t$95$0]]]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := x \cdot \left(z - y\right)\\
\mathbf{if}\;x \leq -2.7 \cdot 10^{-124}:\\
\;\;\;\;t_0\\
\mathbf{elif}\;x \leq 5.5 \cdot 10^{-191}:\\
\;\;\;\;y\\
\mathbf{elif}\;x \leq 3 \cdot 10^{-63}:\\
\;\;\;\;x \cdot z\\
\mathbf{elif}\;x \leq 2.1 \cdot 10^{-13}:\\
\;\;\;\;y\\
\mathbf{else}:\\
\;\;\;\;t_0\\
\end{array}
\end{array}
(FPCore (x y z)
:precision binary64
(let* ((t_0 (* x (- z y))) (t_1 (* y (- 1.0 x))))
(if (<= x -4.5e-124)
t_0
(if (<= x 5.5e-191)
t_1
(if (<= x 3.2e-63) (* x z) (if (<= x 1.75e-12) t_1 t_0))))))
double code(double x, double y, double z) {
double t_0 = x * (z - y);
double t_1 = y * (1.0 - x);
double tmp;
if (x <= -4.5e-124) {
tmp = t_0;
} else if (x <= 5.5e-191) {
tmp = t_1;
} else if (x <= 3.2e-63) {
tmp = x * z;
} else if (x <= 1.75e-12) {
tmp = t_1;
} else {
tmp = t_0;
}
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) :: t_0
real(8) :: t_1
real(8) :: tmp
t_0 = x * (z - y)
t_1 = y * (1.0d0 - x)
if (x <= (-4.5d-124)) then
tmp = t_0
else if (x <= 5.5d-191) then
tmp = t_1
else if (x <= 3.2d-63) then
tmp = x * z
else if (x <= 1.75d-12) then
tmp = t_1
else
tmp = t_0
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double t_0 = x * (z - y);
double t_1 = y * (1.0 - x);
double tmp;
if (x <= -4.5e-124) {
tmp = t_0;
} else if (x <= 5.5e-191) {
tmp = t_1;
} else if (x <= 3.2e-63) {
tmp = x * z;
} else if (x <= 1.75e-12) {
tmp = t_1;
} else {
tmp = t_0;
}
return tmp;
}
def code(x, y, z): t_0 = x * (z - y) t_1 = y * (1.0 - x) tmp = 0 if x <= -4.5e-124: tmp = t_0 elif x <= 5.5e-191: tmp = t_1 elif x <= 3.2e-63: tmp = x * z elif x <= 1.75e-12: tmp = t_1 else: tmp = t_0 return tmp
function code(x, y, z) t_0 = Float64(x * Float64(z - y)) t_1 = Float64(y * Float64(1.0 - x)) tmp = 0.0 if (x <= -4.5e-124) tmp = t_0; elseif (x <= 5.5e-191) tmp = t_1; elseif (x <= 3.2e-63) tmp = Float64(x * z); elseif (x <= 1.75e-12) tmp = t_1; else tmp = t_0; end return tmp end
function tmp_2 = code(x, y, z) t_0 = x * (z - y); t_1 = y * (1.0 - x); tmp = 0.0; if (x <= -4.5e-124) tmp = t_0; elseif (x <= 5.5e-191) tmp = t_1; elseif (x <= 3.2e-63) tmp = x * z; elseif (x <= 1.75e-12) tmp = t_1; else tmp = t_0; end tmp_2 = tmp; end
code[x_, y_, z_] := Block[{t$95$0 = N[(x * N[(z - y), $MachinePrecision]), $MachinePrecision]}, Block[{t$95$1 = N[(y * N[(1.0 - x), $MachinePrecision]), $MachinePrecision]}, If[LessEqual[x, -4.5e-124], t$95$0, If[LessEqual[x, 5.5e-191], t$95$1, If[LessEqual[x, 3.2e-63], N[(x * z), $MachinePrecision], If[LessEqual[x, 1.75e-12], t$95$1, t$95$0]]]]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := x \cdot \left(z - y\right)\\
t_1 := y \cdot \left(1 - x\right)\\
\mathbf{if}\;x \leq -4.5 \cdot 10^{-124}:\\
\;\;\;\;t_0\\
\mathbf{elif}\;x \leq 5.5 \cdot 10^{-191}:\\
\;\;\;\;t_1\\
\mathbf{elif}\;x \leq 3.2 \cdot 10^{-63}:\\
\;\;\;\;x \cdot z\\
\mathbf{elif}\;x \leq 1.75 \cdot 10^{-12}:\\
\;\;\;\;t_1\\
\mathbf{else}:\\
\;\;\;\;t_0\\
\end{array}
\end{array}
(FPCore (x y z)
:precision binary64
(if (or (<= x -3.6e-124)
(not (or (<= x 3.3e-191) (and (not (<= x 3.2e-63)) (<= x 1.32e-13)))))
(* x z)
y))
double code(double x, double y, double z) {
double tmp;
if ((x <= -3.6e-124) || !((x <= 3.3e-191) || (!(x <= 3.2e-63) && (x <= 1.32e-13)))) {
tmp = x * z;
} else {
tmp = 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 ((x <= (-3.6d-124)) .or. (.not. (x <= 3.3d-191) .or. (.not. (x <= 3.2d-63)) .and. (x <= 1.32d-13))) then
tmp = x * z
else
tmp = y
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double tmp;
if ((x <= -3.6e-124) || !((x <= 3.3e-191) || (!(x <= 3.2e-63) && (x <= 1.32e-13)))) {
tmp = x * z;
} else {
tmp = y;
}
return tmp;
}
def code(x, y, z): tmp = 0 if (x <= -3.6e-124) or not ((x <= 3.3e-191) or (not (x <= 3.2e-63) and (x <= 1.32e-13))): tmp = x * z else: tmp = y return tmp
function code(x, y, z) tmp = 0.0 if ((x <= -3.6e-124) || !((x <= 3.3e-191) || (!(x <= 3.2e-63) && (x <= 1.32e-13)))) tmp = Float64(x * z); else tmp = y; end return tmp end
function tmp_2 = code(x, y, z) tmp = 0.0; if ((x <= -3.6e-124) || ~(((x <= 3.3e-191) || (~((x <= 3.2e-63)) && (x <= 1.32e-13))))) tmp = x * z; else tmp = y; end tmp_2 = tmp; end
code[x_, y_, z_] := If[Or[LessEqual[x, -3.6e-124], N[Not[Or[LessEqual[x, 3.3e-191], And[N[Not[LessEqual[x, 3.2e-63]], $MachinePrecision], LessEqual[x, 1.32e-13]]]], $MachinePrecision]], N[(x * z), $MachinePrecision], y]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq -3.6 \cdot 10^{-124} \lor \neg \left(x \leq 3.3 \cdot 10^{-191} \lor \neg \left(x \leq 3.2 \cdot 10^{-63}\right) \land x \leq 1.32 \cdot 10^{-13}\right):\\
\;\;\;\;x \cdot z\\
\mathbf{else}:\\
\;\;\;\;y\\
\end{array}
\end{array}
(FPCore (x y z) :precision binary64 (if (or (<= x -80000000.0) (not (<= x 4e-12))) (* x (- z y)) (+ y (* x z))))
double code(double x, double y, double z) {
double tmp;
if ((x <= -80000000.0) || !(x <= 4e-12)) {
tmp = x * (z - y);
} else {
tmp = y + (x * 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 <= (-80000000.0d0)) .or. (.not. (x <= 4d-12))) then
tmp = x * (z - y)
else
tmp = y + (x * z)
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double tmp;
if ((x <= -80000000.0) || !(x <= 4e-12)) {
tmp = x * (z - y);
} else {
tmp = y + (x * z);
}
return tmp;
}
def code(x, y, z): tmp = 0 if (x <= -80000000.0) or not (x <= 4e-12): tmp = x * (z - y) else: tmp = y + (x * z) return tmp
function code(x, y, z) tmp = 0.0 if ((x <= -80000000.0) || !(x <= 4e-12)) tmp = Float64(x * Float64(z - y)); else tmp = Float64(y + Float64(x * z)); end return tmp end
function tmp_2 = code(x, y, z) tmp = 0.0; if ((x <= -80000000.0) || ~((x <= 4e-12))) tmp = x * (z - y); else tmp = y + (x * z); end tmp_2 = tmp; end
code[x_, y_, z_] := If[Or[LessEqual[x, -80000000.0], N[Not[LessEqual[x, 4e-12]], $MachinePrecision]], N[(x * N[(z - y), $MachinePrecision]), $MachinePrecision], N[(y + N[(x * z), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq -80000000 \lor \neg \left(x \leq 4 \cdot 10^{-12}\right):\\
\;\;\;\;x \cdot \left(z - y\right)\\
\mathbf{else}:\\
\;\;\;\;y + x \cdot z\\
\end{array}
\end{array}
(FPCore (x y z) :precision binary64 (+ y (* x (- z y))))
double code(double x, double y, double z) {
return y + (x * (z - y));
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
code = y + (x * (z - y))
end function
public static double code(double x, double y, double z) {
return y + (x * (z - y));
}
def code(x, y, z): return y + (x * (z - y))
function code(x, y, z) return Float64(y + Float64(x * Float64(z - y))) end
function tmp = code(x, y, z) tmp = y + (x * (z - y)); end
code[x_, y_, z_] := N[(y + N[(x * N[(z - y), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
y + x \cdot \left(z - y\right)
\end{array}
(FPCore (x y z) :precision binary64 y)
double code(double x, double y, double z) {
return y;
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
code = y
end function
public static double code(double x, double y, double z) {
return y;
}
def code(x, y, z): return y
function code(x, y, z) return y end
function tmp = code(x, y, z) tmp = y; end
code[x_, y_, z_] := y
\begin{array}{l}
\\
y
\end{array}
(FPCore (x y z) :precision binary64 (- y (* x (- y z))))
double code(double x, double y, double z) {
return y - (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 = y - (x * (y - z))
end function
public static double code(double x, double y, double z) {
return y - (x * (y - z));
}
def code(x, y, z): return y - (x * (y - z))
function code(x, y, z) return Float64(y - Float64(x * Float64(y - z))) end
function tmp = code(x, y, z) tmp = y - (x * (y - z)); end
code[x_, y_, z_] := N[(y - N[(x * N[(y - z), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
y - x \cdot \left(y - z\right)
\end{array}
herbie shell --seed 2024008
(FPCore (x y z)
:name "Diagrams.Color.HSV:lerp from diagrams-contrib-1.3.0.5"
:precision binary64
:herbie-target
(- y (* x (- y z)))
(+ (* (- 1.0 x) y) (* x z)))