
(FPCore (wj x) :precision binary64 (let* ((t_0 (* wj (exp wj)))) (- wj (/ (- t_0 x) (+ (exp wj) t_0)))))
double code(double wj, double x) {
double t_0 = wj * exp(wj);
return wj - ((t_0 - x) / (exp(wj) + t_0));
}
real(8) function code(wj, x)
real(8), intent (in) :: wj
real(8), intent (in) :: x
real(8) :: t_0
t_0 = wj * exp(wj)
code = wj - ((t_0 - x) / (exp(wj) + t_0))
end function
public static double code(double wj, double x) {
double t_0 = wj * Math.exp(wj);
return wj - ((t_0 - x) / (Math.exp(wj) + t_0));
}
def code(wj, x): t_0 = wj * math.exp(wj) return wj - ((t_0 - x) / (math.exp(wj) + t_0))
function code(wj, x) t_0 = Float64(wj * exp(wj)) return Float64(wj - Float64(Float64(t_0 - x) / Float64(exp(wj) + t_0))) end
function tmp = code(wj, x) t_0 = wj * exp(wj); tmp = wj - ((t_0 - x) / (exp(wj) + t_0)); end
code[wj_, x_] := Block[{t$95$0 = N[(wj * N[Exp[wj], $MachinePrecision]), $MachinePrecision]}, N[(wj - N[(N[(t$95$0 - x), $MachinePrecision] / N[(N[Exp[wj], $MachinePrecision] + t$95$0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := wj \cdot e^{wj}\\
wj - \frac{t\_0 - x}{e^{wj} + t\_0}
\end{array}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 11 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (wj x) :precision binary64 (let* ((t_0 (* wj (exp wj)))) (- wj (/ (- t_0 x) (+ (exp wj) t_0)))))
double code(double wj, double x) {
double t_0 = wj * exp(wj);
return wj - ((t_0 - x) / (exp(wj) + t_0));
}
real(8) function code(wj, x)
real(8), intent (in) :: wj
real(8), intent (in) :: x
real(8) :: t_0
t_0 = wj * exp(wj)
code = wj - ((t_0 - x) / (exp(wj) + t_0))
end function
public static double code(double wj, double x) {
double t_0 = wj * Math.exp(wj);
return wj - ((t_0 - x) / (Math.exp(wj) + t_0));
}
def code(wj, x): t_0 = wj * math.exp(wj) return wj - ((t_0 - x) / (math.exp(wj) + t_0))
function code(wj, x) t_0 = Float64(wj * exp(wj)) return Float64(wj - Float64(Float64(t_0 - x) / Float64(exp(wj) + t_0))) end
function tmp = code(wj, x) t_0 = wj * exp(wj); tmp = wj - ((t_0 - x) / (exp(wj) + t_0)); end
code[wj_, x_] := Block[{t$95$0 = N[(wj * N[Exp[wj], $MachinePrecision]), $MachinePrecision]}, N[(wj - N[(N[(t$95$0 - x), $MachinePrecision] / N[(N[Exp[wj], $MachinePrecision] + t$95$0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := wj \cdot e^{wj}\\
wj - \frac{t\_0 - x}{e^{wj} + t\_0}
\end{array}
\end{array}
(FPCore (wj x)
:precision binary64
(let* ((t_0 (* wj (exp wj))))
(if (<= (+ wj (/ (- x t_0) (+ (exp wj) t_0))) 5e-16)
(fma
wj
(fma
wj
(- (fma x 2.5 1.0) (fma wj (fma x 0.6666666666666666 (* x 2.0)) wj))
(* x -2.0))
x)
(- wj (fma wj (/ 1.0 (+ wj 1.0)) (/ x (* (exp wj) (- -1.0 wj))))))))
double code(double wj, double x) {
double t_0 = wj * exp(wj);
double tmp;
if ((wj + ((x - t_0) / (exp(wj) + t_0))) <= 5e-16) {
tmp = fma(wj, fma(wj, (fma(x, 2.5, 1.0) - fma(wj, fma(x, 0.6666666666666666, (x * 2.0)), wj)), (x * -2.0)), x);
} else {
tmp = wj - fma(wj, (1.0 / (wj + 1.0)), (x / (exp(wj) * (-1.0 - wj))));
}
return tmp;
}
function code(wj, x) t_0 = Float64(wj * exp(wj)) tmp = 0.0 if (Float64(wj + Float64(Float64(x - t_0) / Float64(exp(wj) + t_0))) <= 5e-16) tmp = fma(wj, fma(wj, Float64(fma(x, 2.5, 1.0) - fma(wj, fma(x, 0.6666666666666666, Float64(x * 2.0)), wj)), Float64(x * -2.0)), x); else tmp = Float64(wj - fma(wj, Float64(1.0 / Float64(wj + 1.0)), Float64(x / Float64(exp(wj) * Float64(-1.0 - wj))))); end return tmp end
code[wj_, x_] := Block[{t$95$0 = N[(wj * N[Exp[wj], $MachinePrecision]), $MachinePrecision]}, If[LessEqual[N[(wj + N[(N[(x - t$95$0), $MachinePrecision] / N[(N[Exp[wj], $MachinePrecision] + t$95$0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], 5e-16], N[(wj * N[(wj * N[(N[(x * 2.5 + 1.0), $MachinePrecision] - N[(wj * N[(x * 0.6666666666666666 + N[(x * 2.0), $MachinePrecision]), $MachinePrecision] + wj), $MachinePrecision]), $MachinePrecision] + N[(x * -2.0), $MachinePrecision]), $MachinePrecision] + x), $MachinePrecision], N[(wj - N[(wj * N[(1.0 / N[(wj + 1.0), $MachinePrecision]), $MachinePrecision] + N[(x / N[(N[Exp[wj], $MachinePrecision] * N[(-1.0 - wj), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := wj \cdot e^{wj}\\
\mathbf{if}\;wj + \frac{x - t\_0}{e^{wj} + t\_0} \leq 5 \cdot 10^{-16}:\\
\;\;\;\;\mathsf{fma}\left(wj, \mathsf{fma}\left(wj, \mathsf{fma}\left(x, 2.5, 1\right) - \mathsf{fma}\left(wj, \mathsf{fma}\left(x, 0.6666666666666666, x \cdot 2\right), wj\right), x \cdot -2\right), x\right)\\
\mathbf{else}:\\
\;\;\;\;wj - \mathsf{fma}\left(wj, \frac{1}{wj + 1}, \frac{x}{e^{wj} \cdot \left(-1 - wj\right)}\right)\\
\end{array}
\end{array}
if (-.f64 wj (/.f64 (-.f64 (*.f64 wj (exp.f64 wj)) x) (+.f64 (exp.f64 wj) (*.f64 wj (exp.f64 wj))))) < 5.0000000000000004e-16Initial program 73.1%
Taylor expanded in wj around 0
Simplified100.0%
if 5.0000000000000004e-16 < (-.f64 wj (/.f64 (-.f64 (*.f64 wj (exp.f64 wj)) x) (+.f64 (exp.f64 wj) (*.f64 wj (exp.f64 wj))))) Initial program 95.4%
div-subN/A
sub-negN/A
associate-/l*N/A
distribute-rgt1-inN/A
*-commutativeN/A
associate-/r*N/A
*-inversesN/A
accelerator-lowering-fma.f64N/A
/-lowering-/.f64N/A
+-lowering-+.f64N/A
distribute-neg-frac2N/A
/-lowering-/.f64N/A
neg-lowering-neg.f64N/A
distribute-rgt1-inN/A
*-commutativeN/A
*-lowering-*.f64N/A
exp-lowering-exp.f64N/A
+-lowering-+.f6499.8
Applied egg-rr99.8%
Final simplification99.9%
(FPCore (wj x)
:precision binary64
(let* ((t_0 (* wj (exp wj))))
(if (<= (+ wj (/ (- x t_0) (+ (exp wj) t_0))) 5e-16)
(fma
wj
(fma
wj
(- (fma x 2.5 1.0) (fma wj (fma x 0.6666666666666666 (* x 2.0)) wj))
(* x -2.0))
x)
(fma (/ 1.0 (- -1.0 wj)) (* x (- (/ wj x) (exp (- wj)))) wj))))
double code(double wj, double x) {
double t_0 = wj * exp(wj);
double tmp;
if ((wj + ((x - t_0) / (exp(wj) + t_0))) <= 5e-16) {
tmp = fma(wj, fma(wj, (fma(x, 2.5, 1.0) - fma(wj, fma(x, 0.6666666666666666, (x * 2.0)), wj)), (x * -2.0)), x);
} else {
tmp = fma((1.0 / (-1.0 - wj)), (x * ((wj / x) - exp(-wj))), wj);
}
return tmp;
}
function code(wj, x) t_0 = Float64(wj * exp(wj)) tmp = 0.0 if (Float64(wj + Float64(Float64(x - t_0) / Float64(exp(wj) + t_0))) <= 5e-16) tmp = fma(wj, fma(wj, Float64(fma(x, 2.5, 1.0) - fma(wj, fma(x, 0.6666666666666666, Float64(x * 2.0)), wj)), Float64(x * -2.0)), x); else tmp = fma(Float64(1.0 / Float64(-1.0 - wj)), Float64(x * Float64(Float64(wj / x) - exp(Float64(-wj)))), wj); end return tmp end
code[wj_, x_] := Block[{t$95$0 = N[(wj * N[Exp[wj], $MachinePrecision]), $MachinePrecision]}, If[LessEqual[N[(wj + N[(N[(x - t$95$0), $MachinePrecision] / N[(N[Exp[wj], $MachinePrecision] + t$95$0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], 5e-16], N[(wj * N[(wj * N[(N[(x * 2.5 + 1.0), $MachinePrecision] - N[(wj * N[(x * 0.6666666666666666 + N[(x * 2.0), $MachinePrecision]), $MachinePrecision] + wj), $MachinePrecision]), $MachinePrecision] + N[(x * -2.0), $MachinePrecision]), $MachinePrecision] + x), $MachinePrecision], N[(N[(1.0 / N[(-1.0 - wj), $MachinePrecision]), $MachinePrecision] * N[(x * N[(N[(wj / x), $MachinePrecision] - N[Exp[(-wj)], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + wj), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := wj \cdot e^{wj}\\
\mathbf{if}\;wj + \frac{x - t\_0}{e^{wj} + t\_0} \leq 5 \cdot 10^{-16}:\\
\;\;\;\;\mathsf{fma}\left(wj, \mathsf{fma}\left(wj, \mathsf{fma}\left(x, 2.5, 1\right) - \mathsf{fma}\left(wj, \mathsf{fma}\left(x, 0.6666666666666666, x \cdot 2\right), wj\right), x \cdot -2\right), x\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{1}{-1 - wj}, x \cdot \left(\frac{wj}{x} - e^{-wj}\right), wj\right)\\
\end{array}
\end{array}
if (-.f64 wj (/.f64 (-.f64 (*.f64 wj (exp.f64 wj)) x) (+.f64 (exp.f64 wj) (*.f64 wj (exp.f64 wj))))) < 5.0000000000000004e-16Initial program 73.1%
Taylor expanded in wj around 0
Simplified100.0%
if 5.0000000000000004e-16 < (-.f64 wj (/.f64 (-.f64 (*.f64 wj (exp.f64 wj)) x) (+.f64 (exp.f64 wj) (*.f64 wj (exp.f64 wj))))) Initial program 95.4%
sub-negN/A
+-commutativeN/A
distribute-neg-fracN/A
neg-mul-1N/A
distribute-rgt1-inN/A
times-fracN/A
accelerator-lowering-fma.f64N/A
/-lowering-/.f64N/A
+-lowering-+.f64N/A
/-lowering-/.f64N/A
--lowering--.f64N/A
*-lowering-*.f64N/A
exp-lowering-exp.f64N/A
exp-lowering-exp.f6496.9
Applied egg-rr96.9%
Taylor expanded in x around inf
sub-negN/A
remove-double-negN/A
mul-1-negN/A
distribute-frac-neg2N/A
mul-1-negN/A
distribute-neg-frac2N/A
mul-1-negN/A
distribute-neg-inN/A
*-lowering-*.f64N/A
distribute-neg-inN/A
mul-1-negN/A
distribute-neg-frac2N/A
mul-1-negN/A
distribute-frac-neg2N/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
--lowering--.f64N/A
/-lowering-/.f64N/A
rec-expN/A
exp-lowering-exp.f64N/A
neg-lowering-neg.f6499.8
Simplified99.8%
Final simplification99.9%
(FPCore (wj x)
:precision binary64
(if (<= wj 0.0029)
(fma
wj
(fma
wj
(- (fma x 2.5 1.0) (fma wj (fma x 0.6666666666666666 (* x 2.0)) wj))
(* x -2.0))
x)
(fma
(/ -1.0 (fma wj (* wj wj) 1.0))
(/ wj (/ 1.0 (- (fma wj wj 1.0) wj)))
wj)))
double code(double wj, double x) {
double tmp;
if (wj <= 0.0029) {
tmp = fma(wj, fma(wj, (fma(x, 2.5, 1.0) - fma(wj, fma(x, 0.6666666666666666, (x * 2.0)), wj)), (x * -2.0)), x);
} else {
tmp = fma((-1.0 / fma(wj, (wj * wj), 1.0)), (wj / (1.0 / (fma(wj, wj, 1.0) - wj))), wj);
}
return tmp;
}
function code(wj, x) tmp = 0.0 if (wj <= 0.0029) tmp = fma(wj, fma(wj, Float64(fma(x, 2.5, 1.0) - fma(wj, fma(x, 0.6666666666666666, Float64(x * 2.0)), wj)), Float64(x * -2.0)), x); else tmp = fma(Float64(-1.0 / fma(wj, Float64(wj * wj), 1.0)), Float64(wj / Float64(1.0 / Float64(fma(wj, wj, 1.0) - wj))), wj); end return tmp end
code[wj_, x_] := If[LessEqual[wj, 0.0029], N[(wj * N[(wj * N[(N[(x * 2.5 + 1.0), $MachinePrecision] - N[(wj * N[(x * 0.6666666666666666 + N[(x * 2.0), $MachinePrecision]), $MachinePrecision] + wj), $MachinePrecision]), $MachinePrecision] + N[(x * -2.0), $MachinePrecision]), $MachinePrecision] + x), $MachinePrecision], N[(N[(-1.0 / N[(wj * N[(wj * wj), $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision] * N[(wj / N[(1.0 / N[(N[(wj * wj + 1.0), $MachinePrecision] - wj), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + wj), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;wj \leq 0.0029:\\
\;\;\;\;\mathsf{fma}\left(wj, \mathsf{fma}\left(wj, \mathsf{fma}\left(x, 2.5, 1\right) - \mathsf{fma}\left(wj, \mathsf{fma}\left(x, 0.6666666666666666, x \cdot 2\right), wj\right), x \cdot -2\right), x\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{-1}{\mathsf{fma}\left(wj, wj \cdot wj, 1\right)}, \frac{wj}{\frac{1}{\mathsf{fma}\left(wj, wj, 1\right) - wj}}, wj\right)\\
\end{array}
\end{array}
if wj < 0.0029Initial program 79.3%
Taylor expanded in wj around 0
Simplified98.8%
if 0.0029 < wj Initial program 70.4%
Taylor expanded in x around 0
distribute-rgt1-inN/A
+-commutativeN/A
times-fracN/A
*-inversesN/A
associate-*l/N/A
*-rgt-identityN/A
/-lowering-/.f64N/A
+-commutativeN/A
+-lowering-+.f6485.4
Simplified85.4%
clear-numN/A
associate-/r/N/A
*-lowering-*.f64N/A
/-lowering-/.f64N/A
+-lowering-+.f6485.4
Applied egg-rr85.4%
sub-negN/A
+-commutativeN/A
*-commutativeN/A
un-div-invN/A
distribute-neg-fracN/A
neg-mul-1N/A
flip3-+N/A
div-invN/A
times-fracN/A
accelerator-lowering-fma.f64N/A
Applied egg-rr85.7%
(FPCore (wj x)
:precision binary64
(if (<= wj 0.011)
(fma
wj
(fma
wj
(- (fma x 2.5 1.0) (fma wj (fma x 0.6666666666666666 (* x 2.0)) wj))
(* x -2.0))
x)
(+ wj (/ wj (- -1.0 wj)))))
double code(double wj, double x) {
double tmp;
if (wj <= 0.011) {
tmp = fma(wj, fma(wj, (fma(x, 2.5, 1.0) - fma(wj, fma(x, 0.6666666666666666, (x * 2.0)), wj)), (x * -2.0)), x);
} else {
tmp = wj + (wj / (-1.0 - wj));
}
return tmp;
}
function code(wj, x) tmp = 0.0 if (wj <= 0.011) tmp = fma(wj, fma(wj, Float64(fma(x, 2.5, 1.0) - fma(wj, fma(x, 0.6666666666666666, Float64(x * 2.0)), wj)), Float64(x * -2.0)), x); else tmp = Float64(wj + Float64(wj / Float64(-1.0 - wj))); end return tmp end
code[wj_, x_] := If[LessEqual[wj, 0.011], N[(wj * N[(wj * N[(N[(x * 2.5 + 1.0), $MachinePrecision] - N[(wj * N[(x * 0.6666666666666666 + N[(x * 2.0), $MachinePrecision]), $MachinePrecision] + wj), $MachinePrecision]), $MachinePrecision] + N[(x * -2.0), $MachinePrecision]), $MachinePrecision] + x), $MachinePrecision], N[(wj + N[(wj / N[(-1.0 - wj), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;wj \leq 0.011:\\
\;\;\;\;\mathsf{fma}\left(wj, \mathsf{fma}\left(wj, \mathsf{fma}\left(x, 2.5, 1\right) - \mathsf{fma}\left(wj, \mathsf{fma}\left(x, 0.6666666666666666, x \cdot 2\right), wj\right), x \cdot -2\right), x\right)\\
\mathbf{else}:\\
\;\;\;\;wj + \frac{wj}{-1 - wj}\\
\end{array}
\end{array}
if wj < 0.010999999999999999Initial program 79.3%
Taylor expanded in wj around 0
Simplified98.8%
if 0.010999999999999999 < wj Initial program 70.4%
Taylor expanded in x around 0
distribute-rgt1-inN/A
+-commutativeN/A
times-fracN/A
*-inversesN/A
associate-*l/N/A
*-rgt-identityN/A
/-lowering-/.f64N/A
+-commutativeN/A
+-lowering-+.f6485.4
Simplified85.4%
Final simplification98.5%
(FPCore (wj x)
:precision binary64
(if (<= wj 0.0021)
(fma
x
(* wj (fma wj (+ (/ (- 1.0 wj) x) (fma wj -2.6666666666666665 2.5)) -2.0))
x)
(+ wj (/ wj (- -1.0 wj)))))
double code(double wj, double x) {
double tmp;
if (wj <= 0.0021) {
tmp = fma(x, (wj * fma(wj, (((1.0 - wj) / x) + fma(wj, -2.6666666666666665, 2.5)), -2.0)), x);
} else {
tmp = wj + (wj / (-1.0 - wj));
}
return tmp;
}
function code(wj, x) tmp = 0.0 if (wj <= 0.0021) tmp = fma(x, Float64(wj * fma(wj, Float64(Float64(Float64(1.0 - wj) / x) + fma(wj, -2.6666666666666665, 2.5)), -2.0)), x); else tmp = Float64(wj + Float64(wj / Float64(-1.0 - wj))); end return tmp end
code[wj_, x_] := If[LessEqual[wj, 0.0021], N[(x * N[(wj * N[(wj * N[(N[(N[(1.0 - wj), $MachinePrecision] / x), $MachinePrecision] + N[(wj * -2.6666666666666665 + 2.5), $MachinePrecision]), $MachinePrecision] + -2.0), $MachinePrecision]), $MachinePrecision] + x), $MachinePrecision], N[(wj + N[(wj / N[(-1.0 - wj), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;wj \leq 0.0021:\\
\;\;\;\;\mathsf{fma}\left(x, wj \cdot \mathsf{fma}\left(wj, \frac{1 - wj}{x} + \mathsf{fma}\left(wj, -2.6666666666666665, 2.5\right), -2\right), x\right)\\
\mathbf{else}:\\
\;\;\;\;wj + \frac{wj}{-1 - wj}\\
\end{array}
\end{array}
if wj < 0.00209999999999999987Initial program 79.3%
Taylor expanded in wj around 0
Simplified98.8%
Taylor expanded in x around inf
Simplified98.8%
if 0.00209999999999999987 < wj Initial program 70.4%
Taylor expanded in x around 0
distribute-rgt1-inN/A
+-commutativeN/A
times-fracN/A
*-inversesN/A
associate-*l/N/A
*-rgt-identityN/A
/-lowering-/.f64N/A
+-commutativeN/A
+-lowering-+.f6485.4
Simplified85.4%
Final simplification98.4%
(FPCore (wj x) :precision binary64 (if (<= wj 0.00071) (fma wj (fma x -2.0 (fma (* wj x) 2.5 wj)) x) (+ wj (/ wj (- -1.0 wj)))))
double code(double wj, double x) {
double tmp;
if (wj <= 0.00071) {
tmp = fma(wj, fma(x, -2.0, fma((wj * x), 2.5, wj)), x);
} else {
tmp = wj + (wj / (-1.0 - wj));
}
return tmp;
}
function code(wj, x) tmp = 0.0 if (wj <= 0.00071) tmp = fma(wj, fma(x, -2.0, fma(Float64(wj * x), 2.5, wj)), x); else tmp = Float64(wj + Float64(wj / Float64(-1.0 - wj))); end return tmp end
code[wj_, x_] := If[LessEqual[wj, 0.00071], N[(wj * N[(x * -2.0 + N[(N[(wj * x), $MachinePrecision] * 2.5 + wj), $MachinePrecision]), $MachinePrecision] + x), $MachinePrecision], N[(wj + N[(wj / N[(-1.0 - wj), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;wj \leq 0.00071:\\
\;\;\;\;\mathsf{fma}\left(wj, \mathsf{fma}\left(x, -2, \mathsf{fma}\left(wj \cdot x, 2.5, wj\right)\right), x\right)\\
\mathbf{else}:\\
\;\;\;\;wj + \frac{wj}{-1 - wj}\\
\end{array}
\end{array}
if wj < 7.10000000000000019e-4Initial program 79.3%
Taylor expanded in wj around 0
+-commutativeN/A
accelerator-lowering-fma.f64N/A
Simplified98.5%
if 7.10000000000000019e-4 < wj Initial program 70.4%
Taylor expanded in x around 0
distribute-rgt1-inN/A
+-commutativeN/A
times-fracN/A
*-inversesN/A
associate-*l/N/A
*-rgt-identityN/A
/-lowering-/.f64N/A
+-commutativeN/A
+-lowering-+.f6485.4
Simplified85.4%
Final simplification98.1%
(FPCore (wj x) :precision binary64 (if (<= wj 0.00052) (fma wj (- wj (* wj wj)) x) (+ wj (/ wj (- -1.0 wj)))))
double code(double wj, double x) {
double tmp;
if (wj <= 0.00052) {
tmp = fma(wj, (wj - (wj * wj)), x);
} else {
tmp = wj + (wj / (-1.0 - wj));
}
return tmp;
}
function code(wj, x) tmp = 0.0 if (wj <= 0.00052) tmp = fma(wj, Float64(wj - Float64(wj * wj)), x); else tmp = Float64(wj + Float64(wj / Float64(-1.0 - wj))); end return tmp end
code[wj_, x_] := If[LessEqual[wj, 0.00052], N[(wj * N[(wj - N[(wj * wj), $MachinePrecision]), $MachinePrecision] + x), $MachinePrecision], N[(wj + N[(wj / N[(-1.0 - wj), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;wj \leq 0.00052:\\
\;\;\;\;\mathsf{fma}\left(wj, wj - wj \cdot wj, x\right)\\
\mathbf{else}:\\
\;\;\;\;wj + \frac{wj}{-1 - wj}\\
\end{array}
\end{array}
if wj < 5.19999999999999954e-4Initial program 79.3%
Taylor expanded in wj around 0
Simplified98.8%
Taylor expanded in x around 0
sub-negN/A
distribute-rgt-inN/A
*-lft-identityN/A
distribute-lft-neg-outN/A
unpow2N/A
unsub-negN/A
--lowering--.f64N/A
unpow2N/A
*-lowering-*.f6497.9
Simplified97.9%
if 5.19999999999999954e-4 < wj Initial program 70.4%
Taylor expanded in x around 0
distribute-rgt1-inN/A
+-commutativeN/A
times-fracN/A
*-inversesN/A
associate-*l/N/A
*-rgt-identityN/A
/-lowering-/.f64N/A
+-commutativeN/A
+-lowering-+.f6485.4
Simplified85.4%
Final simplification97.6%
(FPCore (wj x) :precision binary64 (fma wj (- wj (* wj wj)) x))
double code(double wj, double x) {
return fma(wj, (wj - (wj * wj)), x);
}
function code(wj, x) return fma(wj, Float64(wj - Float64(wj * wj)), x) end
code[wj_, x_] := N[(wj * N[(wj - N[(wj * wj), $MachinePrecision]), $MachinePrecision] + x), $MachinePrecision]
\begin{array}{l}
\\
\mathsf{fma}\left(wj, wj - wj \cdot wj, x\right)
\end{array}
Initial program 79.1%
Taylor expanded in wj around 0
Simplified96.3%
Taylor expanded in x around 0
sub-negN/A
distribute-rgt-inN/A
*-lft-identityN/A
distribute-lft-neg-outN/A
unpow2N/A
unsub-negN/A
--lowering--.f64N/A
unpow2N/A
*-lowering-*.f6495.4
Simplified95.4%
(FPCore (wj x) :precision binary64 (fma wj wj x))
double code(double wj, double x) {
return fma(wj, wj, x);
}
function code(wj, x) return fma(wj, wj, x) end
code[wj_, x_] := N[(wj * wj + x), $MachinePrecision]
\begin{array}{l}
\\
\mathsf{fma}\left(wj, wj, x\right)
\end{array}
Initial program 79.1%
Taylor expanded in wj around 0
Simplified96.3%
Taylor expanded in x around 0
sub-negN/A
distribute-rgt-inN/A
*-lft-identityN/A
distribute-lft-neg-outN/A
unpow2N/A
unsub-negN/A
--lowering--.f64N/A
unpow2N/A
*-lowering-*.f6495.4
Simplified95.4%
Taylor expanded in wj around 0
+-commutativeN/A
unpow2N/A
accelerator-lowering-fma.f6495.3
Simplified95.3%
(FPCore (wj x) :precision binary64 x)
double code(double wj, double x) {
return x;
}
real(8) function code(wj, x)
real(8), intent (in) :: wj
real(8), intent (in) :: x
code = x
end function
public static double code(double wj, double x) {
return x;
}
def code(wj, x): return x
function code(wj, x) return x end
function tmp = code(wj, x) tmp = x; end
code[wj_, x_] := x
\begin{array}{l}
\\
x
\end{array}
Initial program 79.1%
Taylor expanded in wj around 0
Simplified84.8%
(FPCore (wj x) :precision binary64 wj)
double code(double wj, double x) {
return wj;
}
real(8) function code(wj, x)
real(8), intent (in) :: wj
real(8), intent (in) :: x
code = wj
end function
public static double code(double wj, double x) {
return wj;
}
def code(wj, x): return wj
function code(wj, x) return wj end
function tmp = code(wj, x) tmp = wj; end
code[wj_, x_] := wj
\begin{array}{l}
\\
wj
\end{array}
Initial program 79.1%
Taylor expanded in wj around inf
Simplified4.6%
(FPCore (wj x) :precision binary64 (- wj (- (/ wj (+ wj 1.0)) (/ x (+ (exp wj) (* wj (exp wj)))))))
double code(double wj, double x) {
return wj - ((wj / (wj + 1.0)) - (x / (exp(wj) + (wj * exp(wj)))));
}
real(8) function code(wj, x)
real(8), intent (in) :: wj
real(8), intent (in) :: x
code = wj - ((wj / (wj + 1.0d0)) - (x / (exp(wj) + (wj * exp(wj)))))
end function
public static double code(double wj, double x) {
return wj - ((wj / (wj + 1.0)) - (x / (Math.exp(wj) + (wj * Math.exp(wj)))));
}
def code(wj, x): return wj - ((wj / (wj + 1.0)) - (x / (math.exp(wj) + (wj * math.exp(wj)))))
function code(wj, x) return Float64(wj - Float64(Float64(wj / Float64(wj + 1.0)) - Float64(x / Float64(exp(wj) + Float64(wj * exp(wj)))))) end
function tmp = code(wj, x) tmp = wj - ((wj / (wj + 1.0)) - (x / (exp(wj) + (wj * exp(wj))))); end
code[wj_, x_] := N[(wj - N[(N[(wj / N[(wj + 1.0), $MachinePrecision]), $MachinePrecision] - N[(x / N[(N[Exp[wj], $MachinePrecision] + N[(wj * N[Exp[wj], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
wj - \left(\frac{wj}{wj + 1} - \frac{x}{e^{wj} + wj \cdot e^{wj}}\right)
\end{array}
herbie shell --seed 2024199
(FPCore (wj x)
:name "Jmat.Real.lambertw, newton loop step"
:precision binary64
:alt
(! :herbie-platform default (let ((ew (exp wj))) (- wj (- (/ wj (+ wj 1)) (/ x (+ ew (* wj ew)))))))
(- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))))