
(FPCore (x y z) :precision binary64 (- (- (* x (log y)) z) y))
double code(double x, double y, double z) {
return ((x * log(y)) - 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 = ((x * log(y)) - z) - y
end function
public static double code(double x, double y, double z) {
return ((x * Math.log(y)) - z) - y;
}
def code(x, y, z): return ((x * math.log(y)) - z) - y
function code(x, y, z) return Float64(Float64(Float64(x * log(y)) - z) - y) end
function tmp = code(x, y, z) tmp = ((x * log(y)) - z) - y; end
code[x_, y_, z_] := N[(N[(N[(x * N[Log[y], $MachinePrecision]), $MachinePrecision] - z), $MachinePrecision] - y), $MachinePrecision]
\begin{array}{l}
\\
\left(x \cdot \log y - z\right) - y
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 9 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x y z) :precision binary64 (- (- (* x (log y)) z) y))
double code(double x, double y, double z) {
return ((x * log(y)) - 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 = ((x * log(y)) - z) - y
end function
public static double code(double x, double y, double z) {
return ((x * Math.log(y)) - z) - y;
}
def code(x, y, z): return ((x * math.log(y)) - z) - y
function code(x, y, z) return Float64(Float64(Float64(x * log(y)) - z) - y) end
function tmp = code(x, y, z) tmp = ((x * log(y)) - z) - y; end
code[x_, y_, z_] := N[(N[(N[(x * N[Log[y], $MachinePrecision]), $MachinePrecision] - z), $MachinePrecision] - y), $MachinePrecision]
\begin{array}{l}
\\
\left(x \cdot \log y - z\right) - y
\end{array}
(FPCore (x y z) :precision binary64 (fma (log y) x (- (- z) y)))
double code(double x, double y, double z) {
return fma(log(y), x, (-z - y));
}
function code(x, y, z) return fma(log(y), x, Float64(Float64(-z) - y)) end
code[x_, y_, z_] := N[(N[Log[y], $MachinePrecision] * x + N[((-z) - y), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\mathsf{fma}\left(\log y, x, \left(-z\right) - y\right)
\end{array}
Initial program 99.8%
lift--.f64N/A
lift--.f64N/A
sub-negN/A
associate--l+N/A
lift-*.f64N/A
*-commutativeN/A
lower-fma.f64N/A
lower--.f64N/A
lower-neg.f6499.8
Applied rewrites99.8%
(FPCore (x y z) :precision binary64 (let* ((t_0 (- (* x (log y)) z))) (if (<= (- t_0 y) -5e-134) (- (- z) y) t_0)))
double code(double x, double y, double z) {
double t_0 = (x * log(y)) - z;
double tmp;
if ((t_0 - y) <= -5e-134) {
tmp = -z - 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 * log(y)) - z
if ((t_0 - y) <= (-5d-134)) then
tmp = -z - 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 * Math.log(y)) - z;
double tmp;
if ((t_0 - y) <= -5e-134) {
tmp = -z - y;
} else {
tmp = t_0;
}
return tmp;
}
def code(x, y, z): t_0 = (x * math.log(y)) - z tmp = 0 if (t_0 - y) <= -5e-134: tmp = -z - y else: tmp = t_0 return tmp
function code(x, y, z) t_0 = Float64(Float64(x * log(y)) - z) tmp = 0.0 if (Float64(t_0 - y) <= -5e-134) tmp = Float64(Float64(-z) - y); else tmp = t_0; end return tmp end
function tmp_2 = code(x, y, z) t_0 = (x * log(y)) - z; tmp = 0.0; if ((t_0 - y) <= -5e-134) tmp = -z - y; else tmp = t_0; end tmp_2 = tmp; end
code[x_, y_, z_] := Block[{t$95$0 = N[(N[(x * N[Log[y], $MachinePrecision]), $MachinePrecision] - z), $MachinePrecision]}, If[LessEqual[N[(t$95$0 - y), $MachinePrecision], -5e-134], N[((-z) - y), $MachinePrecision], t$95$0]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := x \cdot \log y - z\\
\mathbf{if}\;t\_0 - y \leq -5 \cdot 10^{-134}:\\
\;\;\;\;\left(-z\right) - y\\
\mathbf{else}:\\
\;\;\;\;t\_0\\
\end{array}
\end{array}
if (-.f64 (-.f64 (*.f64 x (log.f64 y)) z) y) < -5.0000000000000003e-134Initial program 99.8%
Taylor expanded in z around inf
mul-1-negN/A
lower-neg.f6479.7
Applied rewrites79.7%
if -5.0000000000000003e-134 < (-.f64 (-.f64 (*.f64 x (log.f64 y)) z) y) Initial program 99.8%
Taylor expanded in y around 0
lower--.f64N/A
*-commutativeN/A
lower-*.f64N/A
lower-log.f6496.7
Applied rewrites96.7%
Final simplification86.5%
(FPCore (x y z) :precision binary64 (let* ((t_0 (- (- z) y))) (if (<= z -6.2e+52) t_0 (if (<= z 1.05e-41) (fma (log y) x (- y)) t_0))))
double code(double x, double y, double z) {
double t_0 = -z - y;
double tmp;
if (z <= -6.2e+52) {
tmp = t_0;
} else if (z <= 1.05e-41) {
tmp = fma(log(y), x, -y);
} else {
tmp = t_0;
}
return tmp;
}
function code(x, y, z) t_0 = Float64(Float64(-z) - y) tmp = 0.0 if (z <= -6.2e+52) tmp = t_0; elseif (z <= 1.05e-41) tmp = fma(log(y), x, Float64(-y)); else tmp = t_0; end return tmp end
code[x_, y_, z_] := Block[{t$95$0 = N[((-z) - y), $MachinePrecision]}, If[LessEqual[z, -6.2e+52], t$95$0, If[LessEqual[z, 1.05e-41], N[(N[Log[y], $MachinePrecision] * x + (-y)), $MachinePrecision], t$95$0]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(-z\right) - y\\
\mathbf{if}\;z \leq -6.2 \cdot 10^{+52}:\\
\;\;\;\;t\_0\\
\mathbf{elif}\;z \leq 1.05 \cdot 10^{-41}:\\
\;\;\;\;\mathsf{fma}\left(\log y, x, -y\right)\\
\mathbf{else}:\\
\;\;\;\;t\_0\\
\end{array}
\end{array}
if z < -6.2e52 or 1.05000000000000006e-41 < z Initial program 99.9%
Taylor expanded in z around inf
mul-1-negN/A
lower-neg.f6485.0
Applied rewrites85.0%
if -6.2e52 < z < 1.05000000000000006e-41Initial program 99.7%
Taylor expanded in z around 0
sub-negN/A
*-commutativeN/A
lower-fma.f64N/A
lower-log.f64N/A
lower-neg.f6495.0
Applied rewrites95.0%
(FPCore (x y z) :precision binary64 (if (<= (- (- (* x (log y)) z) y) -1e-148) (- y) (- z)))
double code(double x, double y, double z) {
double tmp;
if ((((x * log(y)) - z) - y) <= -1e-148) {
tmp = -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 * log(y)) - z) - y) <= (-1d-148)) then
tmp = -y
else
tmp = -z
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double tmp;
if ((((x * Math.log(y)) - z) - y) <= -1e-148) {
tmp = -y;
} else {
tmp = -z;
}
return tmp;
}
def code(x, y, z): tmp = 0 if (((x * math.log(y)) - z) - y) <= -1e-148: tmp = -y else: tmp = -z return tmp
function code(x, y, z) tmp = 0.0 if (Float64(Float64(Float64(x * log(y)) - z) - y) <= -1e-148) tmp = Float64(-y); else tmp = Float64(-z); end return tmp end
function tmp_2 = code(x, y, z) tmp = 0.0; if ((((x * log(y)) - z) - y) <= -1e-148) tmp = -y; else tmp = -z; end tmp_2 = tmp; end
code[x_, y_, z_] := If[LessEqual[N[(N[(N[(x * N[Log[y], $MachinePrecision]), $MachinePrecision] - z), $MachinePrecision] - y), $MachinePrecision], -1e-148], (-y), (-z)]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;\left(x \cdot \log y - z\right) - y \leq -1 \cdot 10^{-148}:\\
\;\;\;\;-y\\
\mathbf{else}:\\
\;\;\;\;-z\\
\end{array}
\end{array}
if (-.f64 (-.f64 (*.f64 x (log.f64 y)) z) y) < -9.99999999999999936e-149Initial program 99.8%
Taylor expanded in y around inf
mul-1-negN/A
lower-neg.f6463.0
Applied rewrites63.0%
if -9.99999999999999936e-149 < (-.f64 (-.f64 (*.f64 x (log.f64 y)) z) y) Initial program 99.8%
Taylor expanded in z around inf
mul-1-negN/A
lower-neg.f6449.2
Applied rewrites49.2%
(FPCore (x y z) :precision binary64 (let* ((t_0 (* x (log y)))) (if (<= x -2.2e+69) t_0 (if (<= x 2.1e+166) (- (- z) y) t_0))))
double code(double x, double y, double z) {
double t_0 = x * log(y);
double tmp;
if (x <= -2.2e+69) {
tmp = t_0;
} else if (x <= 2.1e+166) {
tmp = -z - 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 * log(y)
if (x <= (-2.2d+69)) then
tmp = t_0
else if (x <= 2.1d+166) then
tmp = -z - 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 * Math.log(y);
double tmp;
if (x <= -2.2e+69) {
tmp = t_0;
} else if (x <= 2.1e+166) {
tmp = -z - y;
} else {
tmp = t_0;
}
return tmp;
}
def code(x, y, z): t_0 = x * math.log(y) tmp = 0 if x <= -2.2e+69: tmp = t_0 elif x <= 2.1e+166: tmp = -z - y else: tmp = t_0 return tmp
function code(x, y, z) t_0 = Float64(x * log(y)) tmp = 0.0 if (x <= -2.2e+69) tmp = t_0; elseif (x <= 2.1e+166) tmp = Float64(Float64(-z) - y); else tmp = t_0; end return tmp end
function tmp_2 = code(x, y, z) t_0 = x * log(y); tmp = 0.0; if (x <= -2.2e+69) tmp = t_0; elseif (x <= 2.1e+166) tmp = -z - y; else tmp = t_0; end tmp_2 = tmp; end
code[x_, y_, z_] := Block[{t$95$0 = N[(x * N[Log[y], $MachinePrecision]), $MachinePrecision]}, If[LessEqual[x, -2.2e+69], t$95$0, If[LessEqual[x, 2.1e+166], N[((-z) - y), $MachinePrecision], t$95$0]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := x \cdot \log y\\
\mathbf{if}\;x \leq -2.2 \cdot 10^{+69}:\\
\;\;\;\;t\_0\\
\mathbf{elif}\;x \leq 2.1 \cdot 10^{+166}:\\
\;\;\;\;\left(-z\right) - y\\
\mathbf{else}:\\
\;\;\;\;t\_0\\
\end{array}
\end{array}
if x < -2.2000000000000002e69 or 2.1000000000000001e166 < x Initial program 99.6%
Taylor expanded in x around inf
*-commutativeN/A
lower-*.f64N/A
lower-log.f6471.8
Applied rewrites71.8%
if -2.2000000000000002e69 < x < 2.1000000000000001e166Initial program 99.9%
Taylor expanded in z around inf
mul-1-negN/A
lower-neg.f6483.9
Applied rewrites83.9%
Final simplification80.4%
(FPCore (x y z) :precision binary64 (- (- (* x (log y)) y) z))
double code(double x, double y, double z) {
return ((x * log(y)) - 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 = ((x * log(y)) - y) - z
end function
public static double code(double x, double y, double z) {
return ((x * Math.log(y)) - y) - z;
}
def code(x, y, z): return ((x * math.log(y)) - y) - z
function code(x, y, z) return Float64(Float64(Float64(x * log(y)) - y) - z) end
function tmp = code(x, y, z) tmp = ((x * log(y)) - y) - z; end
code[x_, y_, z_] := N[(N[(N[(x * N[Log[y], $MachinePrecision]), $MachinePrecision] - y), $MachinePrecision] - z), $MachinePrecision]
\begin{array}{l}
\\
\left(x \cdot \log y - y\right) - z
\end{array}
Initial program 99.8%
lift--.f64N/A
lift--.f64N/A
associate--l-N/A
+-commutativeN/A
associate--r+N/A
lower--.f64N/A
lower--.f6499.8
lift-*.f64N/A
*-commutativeN/A
lower-*.f6499.8
Applied rewrites99.8%
Final simplification99.8%
(FPCore (x y z) :precision binary64 (- (- (* x (log y)) z) y))
double code(double x, double y, double z) {
return ((x * log(y)) - 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 = ((x * log(y)) - z) - y
end function
public static double code(double x, double y, double z) {
return ((x * Math.log(y)) - z) - y;
}
def code(x, y, z): return ((x * math.log(y)) - z) - y
function code(x, y, z) return Float64(Float64(Float64(x * log(y)) - z) - y) end
function tmp = code(x, y, z) tmp = ((x * log(y)) - z) - y; end
code[x_, y_, z_] := N[(N[(N[(x * N[Log[y], $MachinePrecision]), $MachinePrecision] - z), $MachinePrecision] - y), $MachinePrecision]
\begin{array}{l}
\\
\left(x \cdot \log y - z\right) - y
\end{array}
Initial program 99.8%
(FPCore (x y z) :precision binary64 (- (- z) y))
double code(double x, double y, double z) {
return -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 = -z - y
end function
public static double code(double x, double y, double z) {
return -z - y;
}
def code(x, y, z): return -z - y
function code(x, y, z) return Float64(Float64(-z) - y) end
function tmp = code(x, y, z) tmp = -z - y; end
code[x_, y_, z_] := N[((-z) - y), $MachinePrecision]
\begin{array}{l}
\\
\left(-z\right) - y
\end{array}
Initial program 99.8%
Taylor expanded in z around inf
mul-1-negN/A
lower-neg.f6468.0
Applied rewrites68.0%
(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 Float64(-y) end
function tmp = code(x, y, z) tmp = -y; end
code[x_, y_, z_] := (-y)
\begin{array}{l}
\\
-y
\end{array}
Initial program 99.8%
Taylor expanded in y around inf
mul-1-negN/A
lower-neg.f6439.3
Applied rewrites39.3%
herbie shell --seed 2024255
(FPCore (x y z)
:name "Statistics.Distribution.Poisson:$clogProbability from math-functions-0.1.5.2"
:precision binary64
(- (- (* x (log y)) z) y))