
(FPCore (x) :precision binary64 (/ (exp x) (- (exp x) 1.0)))
double code(double x) {
return exp(x) / (exp(x) - 1.0);
}
real(8) function code(x)
real(8), intent (in) :: x
code = exp(x) / (exp(x) - 1.0d0)
end function
public static double code(double x) {
return Math.exp(x) / (Math.exp(x) - 1.0);
}
def code(x): return math.exp(x) / (math.exp(x) - 1.0)
function code(x) return Float64(exp(x) / Float64(exp(x) - 1.0)) end
function tmp = code(x) tmp = exp(x) / (exp(x) - 1.0); end
code[x_] := N[(N[Exp[x], $MachinePrecision] / N[(N[Exp[x], $MachinePrecision] - 1.0), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{e^{x}}{e^{x} - 1}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 17 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x) :precision binary64 (/ (exp x) (- (exp x) 1.0)))
double code(double x) {
return exp(x) / (exp(x) - 1.0);
}
real(8) function code(x)
real(8), intent (in) :: x
code = exp(x) / (exp(x) - 1.0d0)
end function
public static double code(double x) {
return Math.exp(x) / (Math.exp(x) - 1.0);
}
def code(x): return math.exp(x) / (math.exp(x) - 1.0)
function code(x) return Float64(exp(x) / Float64(exp(x) - 1.0)) end
function tmp = code(x) tmp = exp(x) / (exp(x) - 1.0); end
code[x_] := N[(N[Exp[x], $MachinePrecision] / N[(N[Exp[x], $MachinePrecision] - 1.0), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{e^{x}}{e^{x} - 1}
\end{array}
(FPCore (x) :precision binary64 (/ -1.0 (expm1 (- x))))
double code(double x) {
return -1.0 / expm1(-x);
}
public static double code(double x) {
return -1.0 / Math.expm1(-x);
}
def code(x): return -1.0 / math.expm1(-x)
function code(x) return Float64(-1.0 / expm1(Float64(-x))) end
code[x_] := N[(-1.0 / N[(Exp[(-x)] - 1), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{-1}{\mathsf{expm1}\left(-x\right)}
\end{array}
Initial program 40.7%
clear-numN/A
frac-2negN/A
/-lowering-/.f64N/A
metadata-evalN/A
distribute-neg-fracN/A
neg-sub0N/A
associate-+l-N/A
neg-sub0N/A
+-commutativeN/A
sub-negN/A
div-subN/A
rec-expN/A
*-inversesN/A
accelerator-lowering-expm1.f64N/A
neg-lowering-neg.f64100.0
Applied egg-rr100.0%
(FPCore (x)
:precision binary64
(if (<= (/ (exp x) (+ -1.0 (exp x))) 1.5)
(/ -24.0 (* x (* x (* x x))))
(fma
x
(fma x (* x -0.001388888888888889) 0.08333333333333333)
(+ 0.5 (/ 1.0 x)))))
double code(double x) {
double tmp;
if ((exp(x) / (-1.0 + exp(x))) <= 1.5) {
tmp = -24.0 / (x * (x * (x * x)));
} else {
tmp = fma(x, fma(x, (x * -0.001388888888888889), 0.08333333333333333), (0.5 + (1.0 / x)));
}
return tmp;
}
function code(x) tmp = 0.0 if (Float64(exp(x) / Float64(-1.0 + exp(x))) <= 1.5) tmp = Float64(-24.0 / Float64(x * Float64(x * Float64(x * x)))); else tmp = fma(x, fma(x, Float64(x * -0.001388888888888889), 0.08333333333333333), Float64(0.5 + Float64(1.0 / x))); end return tmp end
code[x_] := If[LessEqual[N[(N[Exp[x], $MachinePrecision] / N[(-1.0 + N[Exp[x], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], 1.5], N[(-24.0 / N[(x * N[(x * N[(x * x), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(x * N[(x * N[(x * -0.001388888888888889), $MachinePrecision] + 0.08333333333333333), $MachinePrecision] + N[(0.5 + N[(1.0 / x), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;\frac{e^{x}}{-1 + e^{x}} \leq 1.5:\\
\;\;\;\;\frac{-24}{x \cdot \left(x \cdot \left(x \cdot x\right)\right)}\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(x, \mathsf{fma}\left(x, x \cdot -0.001388888888888889, 0.08333333333333333\right), 0.5 + \frac{1}{x}\right)\\
\end{array}
\end{array}
if (/.f64 (exp.f64 x) (-.f64 (exp.f64 x) #s(literal 1 binary64))) < 1.5Initial program 100.0%
clear-numN/A
frac-2negN/A
/-lowering-/.f64N/A
metadata-evalN/A
distribute-neg-fracN/A
neg-sub0N/A
associate-+l-N/A
neg-sub0N/A
+-commutativeN/A
sub-negN/A
div-subN/A
rec-expN/A
*-inversesN/A
accelerator-lowering-expm1.f64N/A
neg-lowering-neg.f64100.0
Applied egg-rr100.0%
Taylor expanded in x around 0
*-lowering-*.f64N/A
sub-negN/A
metadata-evalN/A
accelerator-lowering-fma.f64N/A
+-commutativeN/A
accelerator-lowering-fma.f64N/A
sub-negN/A
*-commutativeN/A
metadata-evalN/A
accelerator-lowering-fma.f6477.2
Simplified77.2%
Taylor expanded in x around inf
/-lowering-/.f64N/A
metadata-evalN/A
pow-sqrN/A
unpow2N/A
associate-*l*N/A
unpow2N/A
cube-multN/A
*-lowering-*.f64N/A
cube-multN/A
unpow2N/A
*-lowering-*.f64N/A
unpow2N/A
*-lowering-*.f6477.2
Simplified77.2%
if 1.5 < (/.f64 (exp.f64 x) (-.f64 (exp.f64 x) #s(literal 1 binary64))) Initial program 5.1%
Taylor expanded in x around 0
*-lft-identityN/A
associate-/l*N/A
associate-*l/N/A
distribute-lft-inN/A
*-commutativeN/A
associate-+r+N/A
distribute-lft-inN/A
associate-*l/N/A
*-lft-identityN/A
+-commutativeN/A
associate-*r*N/A
lft-mult-inverseN/A
*-lft-identityN/A
accelerator-lowering-fma.f64N/A
Simplified99.4%
Final simplification91.1%
(FPCore (x) :precision binary64 (/ (exp x) x))
double code(double x) {
return exp(x) / x;
}
real(8) function code(x)
real(8), intent (in) :: x
code = exp(x) / x
end function
public static double code(double x) {
return Math.exp(x) / x;
}
def code(x): return math.exp(x) / x
function code(x) return Float64(exp(x) / x) end
function tmp = code(x) tmp = exp(x) / x; end
code[x_] := N[(N[Exp[x], $MachinePrecision] / x), $MachinePrecision]
\begin{array}{l}
\\
\frac{e^{x}}{x}
\end{array}
Initial program 40.7%
Taylor expanded in x around 0
Simplified98.6%
(FPCore (x)
:precision binary64
(/
-1.0
(*
x
(fma
(*
x
(fma
(fma x 0.041666666666666664 -0.16666666666666666)
(* (fma x 0.041666666666666664 -0.16666666666666666) (* x x))
-0.25))
(fma
x
(fma x (fma x 0.18518518518518517 -0.3888888888888889) 0.6666666666666666)
-2.0)
-1.0))))
double code(double x) {
return -1.0 / (x * fma((x * fma(fma(x, 0.041666666666666664, -0.16666666666666666), (fma(x, 0.041666666666666664, -0.16666666666666666) * (x * x)), -0.25)), fma(x, fma(x, fma(x, 0.18518518518518517, -0.3888888888888889), 0.6666666666666666), -2.0), -1.0));
}
function code(x) return Float64(-1.0 / Float64(x * fma(Float64(x * fma(fma(x, 0.041666666666666664, -0.16666666666666666), Float64(fma(x, 0.041666666666666664, -0.16666666666666666) * Float64(x * x)), -0.25)), fma(x, fma(x, fma(x, 0.18518518518518517, -0.3888888888888889), 0.6666666666666666), -2.0), -1.0))) end
code[x_] := N[(-1.0 / N[(x * N[(N[(x * N[(N[(x * 0.041666666666666664 + -0.16666666666666666), $MachinePrecision] * N[(N[(x * 0.041666666666666664 + -0.16666666666666666), $MachinePrecision] * N[(x * x), $MachinePrecision]), $MachinePrecision] + -0.25), $MachinePrecision]), $MachinePrecision] * N[(x * N[(x * N[(x * 0.18518518518518517 + -0.3888888888888889), $MachinePrecision] + 0.6666666666666666), $MachinePrecision] + -2.0), $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{-1}{x \cdot \mathsf{fma}\left(x \cdot \mathsf{fma}\left(\mathsf{fma}\left(x, 0.041666666666666664, -0.16666666666666666\right), \mathsf{fma}\left(x, 0.041666666666666664, -0.16666666666666666\right) \cdot \left(x \cdot x\right), -0.25\right), \mathsf{fma}\left(x, \mathsf{fma}\left(x, \mathsf{fma}\left(x, 0.18518518518518517, -0.3888888888888889\right), 0.6666666666666666\right), -2\right), -1\right)}
\end{array}
Initial program 40.7%
clear-numN/A
frac-2negN/A
/-lowering-/.f64N/A
metadata-evalN/A
distribute-neg-fracN/A
neg-sub0N/A
associate-+l-N/A
neg-sub0N/A
+-commutativeN/A
sub-negN/A
div-subN/A
rec-expN/A
*-inversesN/A
accelerator-lowering-expm1.f64N/A
neg-lowering-neg.f64100.0
Applied egg-rr100.0%
Taylor expanded in x around 0
*-lowering-*.f64N/A
sub-negN/A
metadata-evalN/A
accelerator-lowering-fma.f64N/A
+-commutativeN/A
accelerator-lowering-fma.f64N/A
sub-negN/A
*-commutativeN/A
metadata-evalN/A
accelerator-lowering-fma.f6491.0
Simplified91.0%
*-commutativeN/A
flip-+N/A
associate-*l/N/A
div-invN/A
accelerator-lowering-fma.f64N/A
Applied egg-rr74.0%
Taylor expanded in x around 0
sub-negN/A
accelerator-lowering-fma.f64N/A
+-commutativeN/A
accelerator-lowering-fma.f64N/A
sub-negN/A
*-commutativeN/A
metadata-evalN/A
accelerator-lowering-fma.f64N/A
metadata-eval93.9
Simplified93.9%
Final simplification93.9%
(FPCore (x)
:precision binary64
(/
-1.0
(*
x
(fma
(*
x
(fma
(fma x 0.041666666666666664 -0.16666666666666666)
(* (fma x 0.041666666666666664 -0.16666666666666666) (* x x))
-0.25))
(fma x (fma x -0.3888888888888889 0.6666666666666666) -2.0)
-1.0))))
double code(double x) {
return -1.0 / (x * fma((x * fma(fma(x, 0.041666666666666664, -0.16666666666666666), (fma(x, 0.041666666666666664, -0.16666666666666666) * (x * x)), -0.25)), fma(x, fma(x, -0.3888888888888889, 0.6666666666666666), -2.0), -1.0));
}
function code(x) return Float64(-1.0 / Float64(x * fma(Float64(x * fma(fma(x, 0.041666666666666664, -0.16666666666666666), Float64(fma(x, 0.041666666666666664, -0.16666666666666666) * Float64(x * x)), -0.25)), fma(x, fma(x, -0.3888888888888889, 0.6666666666666666), -2.0), -1.0))) end
code[x_] := N[(-1.0 / N[(x * N[(N[(x * N[(N[(x * 0.041666666666666664 + -0.16666666666666666), $MachinePrecision] * N[(N[(x * 0.041666666666666664 + -0.16666666666666666), $MachinePrecision] * N[(x * x), $MachinePrecision]), $MachinePrecision] + -0.25), $MachinePrecision]), $MachinePrecision] * N[(x * N[(x * -0.3888888888888889 + 0.6666666666666666), $MachinePrecision] + -2.0), $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{-1}{x \cdot \mathsf{fma}\left(x \cdot \mathsf{fma}\left(\mathsf{fma}\left(x, 0.041666666666666664, -0.16666666666666666\right), \mathsf{fma}\left(x, 0.041666666666666664, -0.16666666666666666\right) \cdot \left(x \cdot x\right), -0.25\right), \mathsf{fma}\left(x, \mathsf{fma}\left(x, -0.3888888888888889, 0.6666666666666666\right), -2\right), -1\right)}
\end{array}
Initial program 40.7%
clear-numN/A
frac-2negN/A
/-lowering-/.f64N/A
metadata-evalN/A
distribute-neg-fracN/A
neg-sub0N/A
associate-+l-N/A
neg-sub0N/A
+-commutativeN/A
sub-negN/A
div-subN/A
rec-expN/A
*-inversesN/A
accelerator-lowering-expm1.f64N/A
neg-lowering-neg.f64100.0
Applied egg-rr100.0%
Taylor expanded in x around 0
*-lowering-*.f64N/A
sub-negN/A
metadata-evalN/A
accelerator-lowering-fma.f64N/A
+-commutativeN/A
accelerator-lowering-fma.f64N/A
sub-negN/A
*-commutativeN/A
metadata-evalN/A
accelerator-lowering-fma.f6491.0
Simplified91.0%
*-commutativeN/A
flip-+N/A
associate-*l/N/A
div-invN/A
accelerator-lowering-fma.f64N/A
Applied egg-rr74.0%
Taylor expanded in x around 0
sub-negN/A
accelerator-lowering-fma.f64N/A
+-commutativeN/A
*-commutativeN/A
accelerator-lowering-fma.f64N/A
metadata-eval93.2
Simplified93.2%
Final simplification93.2%
(FPCore (x)
:precision binary64
(/
-1.0
(*
x
(fma
(*
x
(fma
(fma x 0.041666666666666664 -0.16666666666666666)
(* (fma x 0.041666666666666664 -0.16666666666666666) (* x x))
-0.25))
(fma x 0.6666666666666666 -2.0)
-1.0))))
double code(double x) {
return -1.0 / (x * fma((x * fma(fma(x, 0.041666666666666664, -0.16666666666666666), (fma(x, 0.041666666666666664, -0.16666666666666666) * (x * x)), -0.25)), fma(x, 0.6666666666666666, -2.0), -1.0));
}
function code(x) return Float64(-1.0 / Float64(x * fma(Float64(x * fma(fma(x, 0.041666666666666664, -0.16666666666666666), Float64(fma(x, 0.041666666666666664, -0.16666666666666666) * Float64(x * x)), -0.25)), fma(x, 0.6666666666666666, -2.0), -1.0))) end
code[x_] := N[(-1.0 / N[(x * N[(N[(x * N[(N[(x * 0.041666666666666664 + -0.16666666666666666), $MachinePrecision] * N[(N[(x * 0.041666666666666664 + -0.16666666666666666), $MachinePrecision] * N[(x * x), $MachinePrecision]), $MachinePrecision] + -0.25), $MachinePrecision]), $MachinePrecision] * N[(x * 0.6666666666666666 + -2.0), $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{-1}{x \cdot \mathsf{fma}\left(x \cdot \mathsf{fma}\left(\mathsf{fma}\left(x, 0.041666666666666664, -0.16666666666666666\right), \mathsf{fma}\left(x, 0.041666666666666664, -0.16666666666666666\right) \cdot \left(x \cdot x\right), -0.25\right), \mathsf{fma}\left(x, 0.6666666666666666, -2\right), -1\right)}
\end{array}
Initial program 40.7%
clear-numN/A
frac-2negN/A
/-lowering-/.f64N/A
metadata-evalN/A
distribute-neg-fracN/A
neg-sub0N/A
associate-+l-N/A
neg-sub0N/A
+-commutativeN/A
sub-negN/A
div-subN/A
rec-expN/A
*-inversesN/A
accelerator-lowering-expm1.f64N/A
neg-lowering-neg.f64100.0
Applied egg-rr100.0%
Taylor expanded in x around 0
*-lowering-*.f64N/A
sub-negN/A
metadata-evalN/A
accelerator-lowering-fma.f64N/A
+-commutativeN/A
accelerator-lowering-fma.f64N/A
sub-negN/A
*-commutativeN/A
metadata-evalN/A
accelerator-lowering-fma.f6491.0
Simplified91.0%
*-commutativeN/A
flip-+N/A
associate-*l/N/A
div-invN/A
accelerator-lowering-fma.f64N/A
Applied egg-rr74.0%
Taylor expanded in x around 0
sub-negN/A
*-commutativeN/A
accelerator-lowering-fma.f64N/A
metadata-eval93.1
Simplified93.1%
Final simplification93.1%
(FPCore (x)
:precision binary64
(/
-1.0
(*
x
(fma
(*
x
(fma
(fma x 0.041666666666666664 -0.16666666666666666)
(* (fma x 0.041666666666666664 -0.16666666666666666) (* x x))
-0.25))
-2.0
-1.0))))
double code(double x) {
return -1.0 / (x * fma((x * fma(fma(x, 0.041666666666666664, -0.16666666666666666), (fma(x, 0.041666666666666664, -0.16666666666666666) * (x * x)), -0.25)), -2.0, -1.0));
}
function code(x) return Float64(-1.0 / Float64(x * fma(Float64(x * fma(fma(x, 0.041666666666666664, -0.16666666666666666), Float64(fma(x, 0.041666666666666664, -0.16666666666666666) * Float64(x * x)), -0.25)), -2.0, -1.0))) end
code[x_] := N[(-1.0 / N[(x * N[(N[(x * N[(N[(x * 0.041666666666666664 + -0.16666666666666666), $MachinePrecision] * N[(N[(x * 0.041666666666666664 + -0.16666666666666666), $MachinePrecision] * N[(x * x), $MachinePrecision]), $MachinePrecision] + -0.25), $MachinePrecision]), $MachinePrecision] * -2.0 + -1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{-1}{x \cdot \mathsf{fma}\left(x \cdot \mathsf{fma}\left(\mathsf{fma}\left(x, 0.041666666666666664, -0.16666666666666666\right), \mathsf{fma}\left(x, 0.041666666666666664, -0.16666666666666666\right) \cdot \left(x \cdot x\right), -0.25\right), -2, -1\right)}
\end{array}
Initial program 40.7%
clear-numN/A
frac-2negN/A
/-lowering-/.f64N/A
metadata-evalN/A
distribute-neg-fracN/A
neg-sub0N/A
associate-+l-N/A
neg-sub0N/A
+-commutativeN/A
sub-negN/A
div-subN/A
rec-expN/A
*-inversesN/A
accelerator-lowering-expm1.f64N/A
neg-lowering-neg.f64100.0
Applied egg-rr100.0%
Taylor expanded in x around 0
*-lowering-*.f64N/A
sub-negN/A
metadata-evalN/A
accelerator-lowering-fma.f64N/A
+-commutativeN/A
accelerator-lowering-fma.f64N/A
sub-negN/A
*-commutativeN/A
metadata-evalN/A
accelerator-lowering-fma.f6491.0
Simplified91.0%
*-commutativeN/A
flip-+N/A
associate-*l/N/A
div-invN/A
accelerator-lowering-fma.f64N/A
Applied egg-rr74.0%
Taylor expanded in x around 0
Simplified93.1%
Final simplification93.1%
(FPCore (x) :precision binary64 (/ (/ -1.0 (fma x (fma x (fma x 0.041666666666666664 -0.16666666666666666) 0.5) -1.0)) x))
double code(double x) {
return (-1.0 / fma(x, fma(x, fma(x, 0.041666666666666664, -0.16666666666666666), 0.5), -1.0)) / x;
}
function code(x) return Float64(Float64(-1.0 / fma(x, fma(x, fma(x, 0.041666666666666664, -0.16666666666666666), 0.5), -1.0)) / x) end
code[x_] := N[(N[(-1.0 / N[(x * N[(x * N[(x * 0.041666666666666664 + -0.16666666666666666), $MachinePrecision] + 0.5), $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision] / x), $MachinePrecision]
\begin{array}{l}
\\
\frac{\frac{-1}{\mathsf{fma}\left(x, \mathsf{fma}\left(x, \mathsf{fma}\left(x, 0.041666666666666664, -0.16666666666666666\right), 0.5\right), -1\right)}}{x}
\end{array}
Initial program 40.7%
clear-numN/A
frac-2negN/A
/-lowering-/.f64N/A
metadata-evalN/A
distribute-neg-fracN/A
neg-sub0N/A
associate-+l-N/A
neg-sub0N/A
+-commutativeN/A
sub-negN/A
div-subN/A
rec-expN/A
*-inversesN/A
accelerator-lowering-expm1.f64N/A
neg-lowering-neg.f64100.0
Applied egg-rr100.0%
Taylor expanded in x around 0
*-lowering-*.f64N/A
sub-negN/A
metadata-evalN/A
accelerator-lowering-fma.f64N/A
+-commutativeN/A
accelerator-lowering-fma.f64N/A
sub-negN/A
*-commutativeN/A
metadata-evalN/A
accelerator-lowering-fma.f6491.0
Simplified91.0%
*-commutativeN/A
associate-/r*N/A
/-lowering-/.f64N/A
/-lowering-/.f64N/A
accelerator-lowering-fma.f64N/A
accelerator-lowering-fma.f64N/A
accelerator-lowering-fma.f6491.0
Applied egg-rr91.0%
(FPCore (x) :precision binary64 (/ 1.0 (fma (* x x) (fma x (fma x -0.041666666666666664 0.16666666666666666) -0.5) x)))
double code(double x) {
return 1.0 / fma((x * x), fma(x, fma(x, -0.041666666666666664, 0.16666666666666666), -0.5), x);
}
function code(x) return Float64(1.0 / fma(Float64(x * x), fma(x, fma(x, -0.041666666666666664, 0.16666666666666666), -0.5), x)) end
code[x_] := N[(1.0 / N[(N[(x * x), $MachinePrecision] * N[(x * N[(x * -0.041666666666666664 + 0.16666666666666666), $MachinePrecision] + -0.5), $MachinePrecision] + x), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{1}{\mathsf{fma}\left(x \cdot x, \mathsf{fma}\left(x, \mathsf{fma}\left(x, -0.041666666666666664, 0.16666666666666666\right), -0.5\right), x\right)}
\end{array}
Initial program 40.7%
clear-numN/A
frac-2negN/A
/-lowering-/.f64N/A
metadata-evalN/A
distribute-neg-fracN/A
neg-sub0N/A
associate-+l-N/A
neg-sub0N/A
+-commutativeN/A
sub-negN/A
div-subN/A
rec-expN/A
*-inversesN/A
accelerator-lowering-expm1.f64N/A
neg-lowering-neg.f64100.0
Applied egg-rr100.0%
Taylor expanded in x around 0
*-lowering-*.f64N/A
sub-negN/A
metadata-evalN/A
accelerator-lowering-fma.f64N/A
+-commutativeN/A
accelerator-lowering-fma.f64N/A
sub-negN/A
*-commutativeN/A
metadata-evalN/A
accelerator-lowering-fma.f6491.0
Simplified91.0%
clear-numN/A
/-lowering-/.f64N/A
frac-2negN/A
metadata-evalN/A
/-rgt-identityN/A
distribute-lft-inN/A
distribute-neg-inN/A
*-commutativeN/A
neg-mul-1N/A
remove-double-negN/A
*-commutativeN/A
*-commutativeN/A
associate-*l*N/A
distribute-rgt-neg-inN/A
Applied egg-rr91.0%
Taylor expanded in x around 0
+-commutativeN/A
distribute-lft-inN/A
associate-*r*N/A
unpow2N/A
*-rgt-identityN/A
accelerator-lowering-fma.f64N/A
Simplified91.0%
(FPCore (x)
:precision binary64
(/
-1.0
(*
x
(fma
x
(fma x (fma x 0.041666666666666664 -0.16666666666666666) 0.5)
-1.0))))
double code(double x) {
return -1.0 / (x * fma(x, fma(x, fma(x, 0.041666666666666664, -0.16666666666666666), 0.5), -1.0));
}
function code(x) return Float64(-1.0 / Float64(x * fma(x, fma(x, fma(x, 0.041666666666666664, -0.16666666666666666), 0.5), -1.0))) end
code[x_] := N[(-1.0 / N[(x * N[(x * N[(x * N[(x * 0.041666666666666664 + -0.16666666666666666), $MachinePrecision] + 0.5), $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{-1}{x \cdot \mathsf{fma}\left(x, \mathsf{fma}\left(x, \mathsf{fma}\left(x, 0.041666666666666664, -0.16666666666666666\right), 0.5\right), -1\right)}
\end{array}
Initial program 40.7%
clear-numN/A
frac-2negN/A
/-lowering-/.f64N/A
metadata-evalN/A
distribute-neg-fracN/A
neg-sub0N/A
associate-+l-N/A
neg-sub0N/A
+-commutativeN/A
sub-negN/A
div-subN/A
rec-expN/A
*-inversesN/A
accelerator-lowering-expm1.f64N/A
neg-lowering-neg.f64100.0
Applied egg-rr100.0%
Taylor expanded in x around 0
*-lowering-*.f64N/A
sub-negN/A
metadata-evalN/A
accelerator-lowering-fma.f64N/A
+-commutativeN/A
accelerator-lowering-fma.f64N/A
sub-negN/A
*-commutativeN/A
metadata-evalN/A
accelerator-lowering-fma.f6491.0
Simplified91.0%
(FPCore (x) :precision binary64 (/ -1.0 (* x (fma x (* x (fma x 0.041666666666666664 -0.16666666666666666)) -1.0))))
double code(double x) {
return -1.0 / (x * fma(x, (x * fma(x, 0.041666666666666664, -0.16666666666666666)), -1.0));
}
function code(x) return Float64(-1.0 / Float64(x * fma(x, Float64(x * fma(x, 0.041666666666666664, -0.16666666666666666)), -1.0))) end
code[x_] := N[(-1.0 / N[(x * N[(x * N[(x * N[(x * 0.041666666666666664 + -0.16666666666666666), $MachinePrecision]), $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{-1}{x \cdot \mathsf{fma}\left(x, x \cdot \mathsf{fma}\left(x, 0.041666666666666664, -0.16666666666666666\right), -1\right)}
\end{array}
Initial program 40.7%
clear-numN/A
frac-2negN/A
/-lowering-/.f64N/A
metadata-evalN/A
distribute-neg-fracN/A
neg-sub0N/A
associate-+l-N/A
neg-sub0N/A
+-commutativeN/A
sub-negN/A
div-subN/A
rec-expN/A
*-inversesN/A
accelerator-lowering-expm1.f64N/A
neg-lowering-neg.f64100.0
Applied egg-rr100.0%
Taylor expanded in x around 0
*-lowering-*.f64N/A
sub-negN/A
metadata-evalN/A
accelerator-lowering-fma.f64N/A
+-commutativeN/A
accelerator-lowering-fma.f64N/A
sub-negN/A
*-commutativeN/A
metadata-evalN/A
accelerator-lowering-fma.f6491.0
Simplified91.0%
Taylor expanded in x around inf
sub-negN/A
distribute-rgt-inN/A
*-commutativeN/A
unpow2N/A
associate-*r*N/A
*-commutativeN/A
unpow2N/A
associate-*r*N/A
distribute-lft-neg-outN/A
distribute-rgt-neg-outN/A
mul-1-negN/A
associate-*l*N/A
mul-1-negN/A
distribute-rgt-neg-outN/A
lft-mult-inverseN/A
metadata-evalN/A
metadata-evalN/A
*-commutativeN/A
Simplified90.4%
(FPCore (x) :precision binary64 (if (<= x -4.2) (/ -24.0 (* x (* x (* x x)))) (- (fma x 0.08333333333333333 0.5) (/ -1.0 x))))
double code(double x) {
double tmp;
if (x <= -4.2) {
tmp = -24.0 / (x * (x * (x * x)));
} else {
tmp = fma(x, 0.08333333333333333, 0.5) - (-1.0 / x);
}
return tmp;
}
function code(x) tmp = 0.0 if (x <= -4.2) tmp = Float64(-24.0 / Float64(x * Float64(x * Float64(x * x)))); else tmp = Float64(fma(x, 0.08333333333333333, 0.5) - Float64(-1.0 / x)); end return tmp end
code[x_] := If[LessEqual[x, -4.2], N[(-24.0 / N[(x * N[(x * N[(x * x), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(N[(x * 0.08333333333333333 + 0.5), $MachinePrecision] - N[(-1.0 / x), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq -4.2:\\
\;\;\;\;\frac{-24}{x \cdot \left(x \cdot \left(x \cdot x\right)\right)}\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(x, 0.08333333333333333, 0.5\right) - \frac{-1}{x}\\
\end{array}
\end{array}
if x < -4.20000000000000018Initial program 100.0%
clear-numN/A
frac-2negN/A
/-lowering-/.f64N/A
metadata-evalN/A
distribute-neg-fracN/A
neg-sub0N/A
associate-+l-N/A
neg-sub0N/A
+-commutativeN/A
sub-negN/A
div-subN/A
rec-expN/A
*-inversesN/A
accelerator-lowering-expm1.f64N/A
neg-lowering-neg.f64100.0
Applied egg-rr100.0%
Taylor expanded in x around 0
*-lowering-*.f64N/A
sub-negN/A
metadata-evalN/A
accelerator-lowering-fma.f64N/A
+-commutativeN/A
accelerator-lowering-fma.f64N/A
sub-negN/A
*-commutativeN/A
metadata-evalN/A
accelerator-lowering-fma.f6478.0
Simplified78.0%
Taylor expanded in x around inf
/-lowering-/.f64N/A
metadata-evalN/A
pow-sqrN/A
unpow2N/A
associate-*l*N/A
unpow2N/A
cube-multN/A
*-lowering-*.f64N/A
cube-multN/A
unpow2N/A
*-lowering-*.f64N/A
unpow2N/A
*-lowering-*.f6478.0
Simplified78.0%
if -4.20000000000000018 < x Initial program 5.7%
Taylor expanded in x around 0
*-lft-identityN/A
associate-/l*N/A
associate-*l/N/A
+-commutativeN/A
+-commutativeN/A
distribute-lft-inN/A
*-commutativeN/A
associate-+l+N/A
+-commutativeN/A
distribute-lft-inN/A
associate-*r*N/A
lft-mult-inverseN/A
*-lft-identityN/A
*-commutativeN/A
associate-*l/N/A
*-lft-identityN/A
accelerator-lowering-fma.f64N/A
*-lft-identityN/A
associate-*l/N/A
distribute-rgt-inN/A
Simplified98.8%
+-commutativeN/A
associate-+r+N/A
remove-double-negN/A
distribute-frac-neg2N/A
unsub-negN/A
--lowering--.f64N/A
accelerator-lowering-fma.f64N/A
metadata-evalN/A
frac-2negN/A
/-lowering-/.f6498.8
Applied egg-rr98.8%
(FPCore (x) :precision binary64 (if (<= x -4.5) (/ -2.0 (* x x)) (- (fma x 0.08333333333333333 0.5) (/ -1.0 x))))
double code(double x) {
double tmp;
if (x <= -4.5) {
tmp = -2.0 / (x * x);
} else {
tmp = fma(x, 0.08333333333333333, 0.5) - (-1.0 / x);
}
return tmp;
}
function code(x) tmp = 0.0 if (x <= -4.5) tmp = Float64(-2.0 / Float64(x * x)); else tmp = Float64(fma(x, 0.08333333333333333, 0.5) - Float64(-1.0 / x)); end return tmp end
code[x_] := If[LessEqual[x, -4.5], N[(-2.0 / N[(x * x), $MachinePrecision]), $MachinePrecision], N[(N[(x * 0.08333333333333333 + 0.5), $MachinePrecision] - N[(-1.0 / x), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq -4.5:\\
\;\;\;\;\frac{-2}{x \cdot x}\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(x, 0.08333333333333333, 0.5\right) - \frac{-1}{x}\\
\end{array}
\end{array}
if x < -4.5Initial program 100.0%
clear-numN/A
frac-2negN/A
/-lowering-/.f64N/A
metadata-evalN/A
distribute-neg-fracN/A
neg-sub0N/A
associate-+l-N/A
neg-sub0N/A
+-commutativeN/A
sub-negN/A
div-subN/A
rec-expN/A
*-inversesN/A
accelerator-lowering-expm1.f64N/A
neg-lowering-neg.f64100.0
Applied egg-rr100.0%
Taylor expanded in x around 0
*-lowering-*.f64N/A
sub-negN/A
*-commutativeN/A
metadata-evalN/A
accelerator-lowering-fma.f6452.3
Simplified52.3%
Taylor expanded in x around inf
/-lowering-/.f64N/A
unpow2N/A
*-lowering-*.f6452.3
Simplified52.3%
if -4.5 < x Initial program 5.7%
Taylor expanded in x around 0
*-lft-identityN/A
associate-/l*N/A
associate-*l/N/A
+-commutativeN/A
+-commutativeN/A
distribute-lft-inN/A
*-commutativeN/A
associate-+l+N/A
+-commutativeN/A
distribute-lft-inN/A
associate-*r*N/A
lft-mult-inverseN/A
*-lft-identityN/A
*-commutativeN/A
associate-*l/N/A
*-lft-identityN/A
accelerator-lowering-fma.f64N/A
*-lft-identityN/A
associate-*l/N/A
distribute-rgt-inN/A
Simplified98.8%
+-commutativeN/A
associate-+r+N/A
remove-double-negN/A
distribute-frac-neg2N/A
unsub-negN/A
--lowering--.f64N/A
accelerator-lowering-fma.f64N/A
metadata-evalN/A
frac-2negN/A
/-lowering-/.f6498.8
Applied egg-rr98.8%
(FPCore (x) :precision binary64 (if (<= x -1.76) (/ -2.0 (* x x)) (+ 0.5 (/ 1.0 x))))
double code(double x) {
double tmp;
if (x <= -1.76) {
tmp = -2.0 / (x * x);
} else {
tmp = 0.5 + (1.0 / x);
}
return tmp;
}
real(8) function code(x)
real(8), intent (in) :: x
real(8) :: tmp
if (x <= (-1.76d0)) then
tmp = (-2.0d0) / (x * x)
else
tmp = 0.5d0 + (1.0d0 / x)
end if
code = tmp
end function
public static double code(double x) {
double tmp;
if (x <= -1.76) {
tmp = -2.0 / (x * x);
} else {
tmp = 0.5 + (1.0 / x);
}
return tmp;
}
def code(x): tmp = 0 if x <= -1.76: tmp = -2.0 / (x * x) else: tmp = 0.5 + (1.0 / x) return tmp
function code(x) tmp = 0.0 if (x <= -1.76) tmp = Float64(-2.0 / Float64(x * x)); else tmp = Float64(0.5 + Float64(1.0 / x)); end return tmp end
function tmp_2 = code(x) tmp = 0.0; if (x <= -1.76) tmp = -2.0 / (x * x); else tmp = 0.5 + (1.0 / x); end tmp_2 = tmp; end
code[x_] := If[LessEqual[x, -1.76], N[(-2.0 / N[(x * x), $MachinePrecision]), $MachinePrecision], N[(0.5 + N[(1.0 / x), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq -1.76:\\
\;\;\;\;\frac{-2}{x \cdot x}\\
\mathbf{else}:\\
\;\;\;\;0.5 + \frac{1}{x}\\
\end{array}
\end{array}
if x < -1.76000000000000001Initial program 100.0%
clear-numN/A
frac-2negN/A
/-lowering-/.f64N/A
metadata-evalN/A
distribute-neg-fracN/A
neg-sub0N/A
associate-+l-N/A
neg-sub0N/A
+-commutativeN/A
sub-negN/A
div-subN/A
rec-expN/A
*-inversesN/A
accelerator-lowering-expm1.f64N/A
neg-lowering-neg.f64100.0
Applied egg-rr100.0%
Taylor expanded in x around 0
*-lowering-*.f64N/A
sub-negN/A
*-commutativeN/A
metadata-evalN/A
accelerator-lowering-fma.f6452.3
Simplified52.3%
Taylor expanded in x around inf
/-lowering-/.f64N/A
unpow2N/A
*-lowering-*.f6452.3
Simplified52.3%
if -1.76000000000000001 < x Initial program 5.7%
Taylor expanded in x around 0
*-lft-identityN/A
associate-*l/N/A
distribute-rgt-inN/A
*-lft-identityN/A
+-lowering-+.f64N/A
/-lowering-/.f64N/A
associate-*l*N/A
rgt-mult-inverseN/A
metadata-eval98.6
Simplified98.6%
Final simplification81.4%
(FPCore (x) :precision binary64 (/ -1.0 (* x (fma x 0.5 -1.0))))
double code(double x) {
return -1.0 / (x * fma(x, 0.5, -1.0));
}
function code(x) return Float64(-1.0 / Float64(x * fma(x, 0.5, -1.0))) end
code[x_] := N[(-1.0 / N[(x * N[(x * 0.5 + -1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{-1}{x \cdot \mathsf{fma}\left(x, 0.5, -1\right)}
\end{array}
Initial program 40.7%
clear-numN/A
frac-2negN/A
/-lowering-/.f64N/A
metadata-evalN/A
distribute-neg-fracN/A
neg-sub0N/A
associate-+l-N/A
neg-sub0N/A
+-commutativeN/A
sub-negN/A
div-subN/A
rec-expN/A
*-inversesN/A
accelerator-lowering-expm1.f64N/A
neg-lowering-neg.f64100.0
Applied egg-rr100.0%
Taylor expanded in x around 0
*-lowering-*.f64N/A
sub-negN/A
*-commutativeN/A
metadata-evalN/A
accelerator-lowering-fma.f6481.3
Simplified81.3%
(FPCore (x) :precision binary64 (/ 1.0 x))
double code(double x) {
return 1.0 / x;
}
real(8) function code(x)
real(8), intent (in) :: x
code = 1.0d0 / x
end function
public static double code(double x) {
return 1.0 / x;
}
def code(x): return 1.0 / x
function code(x) return Float64(1.0 / x) end
function tmp = code(x) tmp = 1.0 / x; end
code[x_] := N[(1.0 / x), $MachinePrecision]
\begin{array}{l}
\\
\frac{1}{x}
\end{array}
Initial program 40.7%
Taylor expanded in x around 0
/-lowering-/.f6463.5
Simplified63.5%
(FPCore (x) :precision binary64 1.0)
double code(double x) {
return 1.0;
}
real(8) function code(x)
real(8), intent (in) :: x
code = 1.0d0
end function
public static double code(double x) {
return 1.0;
}
def code(x): return 1.0
function code(x) return 1.0 end
function tmp = code(x) tmp = 1.0; end
code[x_] := 1.0
\begin{array}{l}
\\
1
\end{array}
Initial program 40.7%
Taylor expanded in x around 0
Simplified98.6%
Taylor expanded in x around 0
/-lowering-/.f64N/A
+-lowering-+.f6462.7
Simplified62.7%
Taylor expanded in x around inf
Simplified3.7%
(FPCore (x) :precision binary64 (/ (- 1.0) (expm1 (- x))))
double code(double x) {
return -1.0 / expm1(-x);
}
public static double code(double x) {
return -1.0 / Math.expm1(-x);
}
def code(x): return -1.0 / math.expm1(-x)
function code(x) return Float64(Float64(-1.0) / expm1(Float64(-x))) end
code[x_] := N[((-1.0) / N[(Exp[(-x)] - 1), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{-1}{\mathsf{expm1}\left(-x\right)}
\end{array}
herbie shell --seed 2024198
(FPCore (x)
:name "expq2 (section 3.11)"
:precision binary64
:pre (> 710.0 x)
:alt
(! :herbie-platform default (/ (- 1) (expm1 (- x))))
(/ (exp x) (- (exp x) 1.0)))