
(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 10 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-23)
(+
x
(*
wj
(+
(* x -2.0)
(*
wj
(+ 1.0 (+ (* x 2.5) (* wj (+ (* x -2.6666666666666665) -1.0))))))))
(+ wj (+ (* x (/ (exp (- wj)) (+ wj 1.0))) (/ 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-23) {
tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + ((x * 2.5) + (wj * ((x * -2.6666666666666665) + -1.0)))))));
} else {
tmp = wj + ((x * (exp(-wj) / (wj + 1.0))) + (wj / (-1.0 - wj)));
}
return tmp;
}
real(8) function code(wj, x)
real(8), intent (in) :: wj
real(8), intent (in) :: x
real(8) :: t_0
real(8) :: tmp
t_0 = wj * exp(wj)
if ((wj + ((x - t_0) / (exp(wj) + t_0))) <= 5d-23) then
tmp = x + (wj * ((x * (-2.0d0)) + (wj * (1.0d0 + ((x * 2.5d0) + (wj * ((x * (-2.6666666666666665d0)) + (-1.0d0))))))))
else
tmp = wj + ((x * (exp(-wj) / (wj + 1.0d0))) + (wj / ((-1.0d0) - wj)))
end if
code = tmp
end function
public static double code(double wj, double x) {
double t_0 = wj * Math.exp(wj);
double tmp;
if ((wj + ((x - t_0) / (Math.exp(wj) + t_0))) <= 5e-23) {
tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + ((x * 2.5) + (wj * ((x * -2.6666666666666665) + -1.0)))))));
} else {
tmp = wj + ((x * (Math.exp(-wj) / (wj + 1.0))) + (wj / (-1.0 - wj)));
}
return tmp;
}
def code(wj, x): t_0 = wj * math.exp(wj) tmp = 0 if (wj + ((x - t_0) / (math.exp(wj) + t_0))) <= 5e-23: tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + ((x * 2.5) + (wj * ((x * -2.6666666666666665) + -1.0))))))) else: tmp = wj + ((x * (math.exp(-wj) / (wj + 1.0))) + (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-23) tmp = Float64(x + Float64(wj * Float64(Float64(x * -2.0) + Float64(wj * Float64(1.0 + Float64(Float64(x * 2.5) + Float64(wj * Float64(Float64(x * -2.6666666666666665) + -1.0)))))))); else tmp = Float64(wj + Float64(Float64(x * Float64(exp(Float64(-wj)) / Float64(wj + 1.0))) + Float64(wj / Float64(-1.0 - wj)))); end return tmp end
function tmp_2 = code(wj, x) t_0 = wj * exp(wj); tmp = 0.0; if ((wj + ((x - t_0) / (exp(wj) + t_0))) <= 5e-23) tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + ((x * 2.5) + (wj * ((x * -2.6666666666666665) + -1.0))))))); else tmp = wj + ((x * (exp(-wj) / (wj + 1.0))) + (wj / (-1.0 - wj))); end tmp_2 = 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-23], N[(x + N[(wj * N[(N[(x * -2.0), $MachinePrecision] + N[(wj * N[(1.0 + N[(N[(x * 2.5), $MachinePrecision] + N[(wj * N[(N[(x * -2.6666666666666665), $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(wj + N[(N[(x * N[(N[Exp[(-wj)], $MachinePrecision] / N[(wj + 1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[(wj / N[(-1.0 - wj), $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^{-23}:\\
\;\;\;\;x + wj \cdot \left(x \cdot -2 + wj \cdot \left(1 + \left(x \cdot 2.5 + wj \cdot \left(x \cdot -2.6666666666666665 + -1\right)\right)\right)\right)\\
\mathbf{else}:\\
\;\;\;\;wj + \left(x \cdot \frac{e^{-wj}}{wj + 1} + \frac{wj}{-1 - 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.0000000000000002e-23Initial program 70.7%
distribute-rgt1-in70.7%
associate-/l/70.8%
div-sub70.8%
associate-/l*70.8%
*-inverses70.8%
*-rgt-identity70.8%
Simplified70.8%
Taylor expanded in x around inf 70.7%
+-commutative70.7%
associate-/r*70.7%
rec-exp70.7%
+-commutative70.7%
Simplified70.7%
Taylor expanded in wj around 0 70.6%
Taylor expanded in x around 0 70.7%
Taylor expanded in wj around 0 99.2%
if 5.0000000000000002e-23 < (-.f64 wj (/.f64 (-.f64 (*.f64 wj (exp.f64 wj)) x) (+.f64 (exp.f64 wj) (*.f64 wj (exp.f64 wj))))) Initial program 90.2%
distribute-rgt1-in92.9%
associate-/l/92.9%
div-sub90.2%
associate-/l*90.2%
*-inverses99.8%
*-rgt-identity99.8%
Simplified99.8%
Taylor expanded in x around inf 99.8%
+-commutative99.8%
associate-/r*99.8%
rec-exp99.8%
+-commutative99.8%
Simplified99.8%
Taylor expanded in x around 0 99.8%
associate--l+99.8%
associate-/l*99.8%
+-commutative99.8%
+-commutative99.8%
Simplified99.8%
Final simplification99.4%
(FPCore (wj x)
:precision binary64
(if (<= wj 7.3e-6)
(+
x
(*
wj
(+
(* x -2.0)
(* wj (+ 1.0 (+ (* x 2.5) (* wj (+ (* x -2.6666666666666665) -1.0))))))))
(+ wj (/ (- wj (/ x (exp wj))) (- -1.0 wj)))))
double code(double wj, double x) {
double tmp;
if (wj <= 7.3e-6) {
tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + ((x * 2.5) + (wj * ((x * -2.6666666666666665) + -1.0)))))));
} else {
tmp = wj + ((wj - (x / exp(wj))) / (-1.0 - wj));
}
return tmp;
}
real(8) function code(wj, x)
real(8), intent (in) :: wj
real(8), intent (in) :: x
real(8) :: tmp
if (wj <= 7.3d-6) then
tmp = x + (wj * ((x * (-2.0d0)) + (wj * (1.0d0 + ((x * 2.5d0) + (wj * ((x * (-2.6666666666666665d0)) + (-1.0d0))))))))
else
tmp = wj + ((wj - (x / exp(wj))) / ((-1.0d0) - wj))
end if
code = tmp
end function
public static double code(double wj, double x) {
double tmp;
if (wj <= 7.3e-6) {
tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + ((x * 2.5) + (wj * ((x * -2.6666666666666665) + -1.0)))))));
} else {
tmp = wj + ((wj - (x / Math.exp(wj))) / (-1.0 - wj));
}
return tmp;
}
def code(wj, x): tmp = 0 if wj <= 7.3e-6: tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + ((x * 2.5) + (wj * ((x * -2.6666666666666665) + -1.0))))))) else: tmp = wj + ((wj - (x / math.exp(wj))) / (-1.0 - wj)) return tmp
function code(wj, x) tmp = 0.0 if (wj <= 7.3e-6) tmp = Float64(x + Float64(wj * Float64(Float64(x * -2.0) + Float64(wj * Float64(1.0 + Float64(Float64(x * 2.5) + Float64(wj * Float64(Float64(x * -2.6666666666666665) + -1.0)))))))); else tmp = Float64(wj + Float64(Float64(wj - Float64(x / exp(wj))) / Float64(-1.0 - wj))); end return tmp end
function tmp_2 = code(wj, x) tmp = 0.0; if (wj <= 7.3e-6) tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + ((x * 2.5) + (wj * ((x * -2.6666666666666665) + -1.0))))))); else tmp = wj + ((wj - (x / exp(wj))) / (-1.0 - wj)); end tmp_2 = tmp; end
code[wj_, x_] := If[LessEqual[wj, 7.3e-6], N[(x + N[(wj * N[(N[(x * -2.0), $MachinePrecision] + N[(wj * N[(1.0 + N[(N[(x * 2.5), $MachinePrecision] + N[(wj * N[(N[(x * -2.6666666666666665), $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(wj + N[(N[(wj - N[(x / N[Exp[wj], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(-1.0 - wj), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;wj \leq 7.3 \cdot 10^{-6}:\\
\;\;\;\;x + wj \cdot \left(x \cdot -2 + wj \cdot \left(1 + \left(x \cdot 2.5 + wj \cdot \left(x \cdot -2.6666666666666665 + -1\right)\right)\right)\right)\\
\mathbf{else}:\\
\;\;\;\;wj + \frac{wj - \frac{x}{e^{wj}}}{-1 - wj}\\
\end{array}
\end{array}
if wj < 7.30000000000000041e-6Initial program 77.4%
distribute-rgt1-in78.2%
associate-/l/78.2%
div-sub77.4%
associate-/l*77.4%
*-inverses78.2%
*-rgt-identity78.2%
Simplified78.2%
Taylor expanded in x around inf 78.2%
+-commutative78.2%
associate-/r*78.2%
rec-exp78.2%
+-commutative78.2%
Simplified78.2%
Taylor expanded in wj around 0 77.3%
Taylor expanded in x around 0 77.4%
Taylor expanded in wj around 0 98.6%
if 7.30000000000000041e-6 < wj Initial program 48.3%
distribute-rgt1-in48.0%
associate-/l/48.6%
div-sub48.6%
associate-/l*48.6%
*-inverses98.6%
*-rgt-identity98.6%
Simplified98.6%
Final simplification98.6%
(FPCore (wj x)
:precision binary64
(if (<= wj 0.69)
(+
x
(*
wj
(+
(* x -2.0)
(* wj (+ 1.0 (+ (* x 2.5) (* wj (+ (* x -2.6666666666666665) -1.0))))))))
(+ wj (+ -1.0 (/ (+ 1.0 (/ (- -1.0 (/ -1.0 wj)) wj)) wj)))))
double code(double wj, double x) {
double tmp;
if (wj <= 0.69) {
tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + ((x * 2.5) + (wj * ((x * -2.6666666666666665) + -1.0)))))));
} else {
tmp = wj + (-1.0 + ((1.0 + ((-1.0 - (-1.0 / wj)) / wj)) / wj));
}
return tmp;
}
real(8) function code(wj, x)
real(8), intent (in) :: wj
real(8), intent (in) :: x
real(8) :: tmp
if (wj <= 0.69d0) then
tmp = x + (wj * ((x * (-2.0d0)) + (wj * (1.0d0 + ((x * 2.5d0) + (wj * ((x * (-2.6666666666666665d0)) + (-1.0d0))))))))
else
tmp = wj + ((-1.0d0) + ((1.0d0 + (((-1.0d0) - ((-1.0d0) / wj)) / wj)) / wj))
end if
code = tmp
end function
public static double code(double wj, double x) {
double tmp;
if (wj <= 0.69) {
tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + ((x * 2.5) + (wj * ((x * -2.6666666666666665) + -1.0)))))));
} else {
tmp = wj + (-1.0 + ((1.0 + ((-1.0 - (-1.0 / wj)) / wj)) / wj));
}
return tmp;
}
def code(wj, x): tmp = 0 if wj <= 0.69: tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + ((x * 2.5) + (wj * ((x * -2.6666666666666665) + -1.0))))))) else: tmp = wj + (-1.0 + ((1.0 + ((-1.0 - (-1.0 / wj)) / wj)) / wj)) return tmp
function code(wj, x) tmp = 0.0 if (wj <= 0.69) tmp = Float64(x + Float64(wj * Float64(Float64(x * -2.0) + Float64(wj * Float64(1.0 + Float64(Float64(x * 2.5) + Float64(wj * Float64(Float64(x * -2.6666666666666665) + -1.0)))))))); else tmp = Float64(wj + Float64(-1.0 + Float64(Float64(1.0 + Float64(Float64(-1.0 - Float64(-1.0 / wj)) / wj)) / wj))); end return tmp end
function tmp_2 = code(wj, x) tmp = 0.0; if (wj <= 0.69) tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + ((x * 2.5) + (wj * ((x * -2.6666666666666665) + -1.0))))))); else tmp = wj + (-1.0 + ((1.0 + ((-1.0 - (-1.0 / wj)) / wj)) / wj)); end tmp_2 = tmp; end
code[wj_, x_] := If[LessEqual[wj, 0.69], N[(x + N[(wj * N[(N[(x * -2.0), $MachinePrecision] + N[(wj * N[(1.0 + N[(N[(x * 2.5), $MachinePrecision] + N[(wj * N[(N[(x * -2.6666666666666665), $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(wj + N[(-1.0 + N[(N[(1.0 + N[(N[(-1.0 - N[(-1.0 / wj), $MachinePrecision]), $MachinePrecision] / wj), $MachinePrecision]), $MachinePrecision] / wj), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;wj \leq 0.69:\\
\;\;\;\;x + wj \cdot \left(x \cdot -2 + wj \cdot \left(1 + \left(x \cdot 2.5 + wj \cdot \left(x \cdot -2.6666666666666665 + -1\right)\right)\right)\right)\\
\mathbf{else}:\\
\;\;\;\;wj + \left(-1 + \frac{1 + \frac{-1 - \frac{-1}{wj}}{wj}}{wj}\right)\\
\end{array}
\end{array}
if wj < 0.68999999999999995Initial program 77.6%
distribute-rgt1-in78.4%
associate-/l/78.4%
div-sub77.6%
associate-/l*77.6%
*-inverses78.4%
*-rgt-identity78.4%
Simplified78.4%
Taylor expanded in x around inf 78.4%
+-commutative78.4%
associate-/r*78.4%
rec-exp78.4%
+-commutative78.4%
Simplified78.4%
Taylor expanded in wj around 0 77.5%
Taylor expanded in x around 0 77.6%
Taylor expanded in wj around 0 98.0%
if 0.68999999999999995 < wj Initial program 28.6%
distribute-rgt1-in28.6%
associate-/l/28.6%
div-sub28.6%
associate-/l*28.6%
*-inverses100.0%
*-rgt-identity100.0%
Simplified100.0%
Taylor expanded in wj around 0 58.5%
*-commutative58.5%
Simplified58.5%
Taylor expanded in wj around -inf 87.7%
mul-1-neg87.7%
unsub-neg87.7%
mul-1-neg87.7%
unsub-neg87.7%
sub-neg87.7%
distribute-neg-frac87.7%
metadata-eval87.7%
Simplified87.7%
Final simplification97.7%
(FPCore (wj x) :precision binary64 (if (<= wj 1.42) (+ x (* wj (+ (* x -2.0) (* wj (+ 1.0 (* x 2.5)))))) (+ wj (+ -1.0 (/ (+ 1.0 (/ (- -1.0 (/ -1.0 wj)) wj)) wj)))))
double code(double wj, double x) {
double tmp;
if (wj <= 1.42) {
tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + (x * 2.5)))));
} else {
tmp = wj + (-1.0 + ((1.0 + ((-1.0 - (-1.0 / wj)) / wj)) / wj));
}
return tmp;
}
real(8) function code(wj, x)
real(8), intent (in) :: wj
real(8), intent (in) :: x
real(8) :: tmp
if (wj <= 1.42d0) then
tmp = x + (wj * ((x * (-2.0d0)) + (wj * (1.0d0 + (x * 2.5d0)))))
else
tmp = wj + ((-1.0d0) + ((1.0d0 + (((-1.0d0) - ((-1.0d0) / wj)) / wj)) / wj))
end if
code = tmp
end function
public static double code(double wj, double x) {
double tmp;
if (wj <= 1.42) {
tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + (x * 2.5)))));
} else {
tmp = wj + (-1.0 + ((1.0 + ((-1.0 - (-1.0 / wj)) / wj)) / wj));
}
return tmp;
}
def code(wj, x): tmp = 0 if wj <= 1.42: tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + (x * 2.5))))) else: tmp = wj + (-1.0 + ((1.0 + ((-1.0 - (-1.0 / wj)) / wj)) / wj)) return tmp
function code(wj, x) tmp = 0.0 if (wj <= 1.42) tmp = Float64(x + Float64(wj * Float64(Float64(x * -2.0) + Float64(wj * Float64(1.0 + Float64(x * 2.5)))))); else tmp = Float64(wj + Float64(-1.0 + Float64(Float64(1.0 + Float64(Float64(-1.0 - Float64(-1.0 / wj)) / wj)) / wj))); end return tmp end
function tmp_2 = code(wj, x) tmp = 0.0; if (wj <= 1.42) tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + (x * 2.5))))); else tmp = wj + (-1.0 + ((1.0 + ((-1.0 - (-1.0 / wj)) / wj)) / wj)); end tmp_2 = tmp; end
code[wj_, x_] := If[LessEqual[wj, 1.42], N[(x + N[(wj * N[(N[(x * -2.0), $MachinePrecision] + N[(wj * N[(1.0 + N[(x * 2.5), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(wj + N[(-1.0 + N[(N[(1.0 + N[(N[(-1.0 - N[(-1.0 / wj), $MachinePrecision]), $MachinePrecision] / wj), $MachinePrecision]), $MachinePrecision] / wj), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;wj \leq 1.42:\\
\;\;\;\;x + wj \cdot \left(x \cdot -2 + wj \cdot \left(1 + x \cdot 2.5\right)\right)\\
\mathbf{else}:\\
\;\;\;\;wj + \left(-1 + \frac{1 + \frac{-1 - \frac{-1}{wj}}{wj}}{wj}\right)\\
\end{array}
\end{array}
if wj < 1.4199999999999999Initial program 77.6%
distribute-rgt1-in78.4%
associate-/l/78.4%
div-sub77.6%
associate-/l*77.6%
*-inverses78.4%
*-rgt-identity78.4%
Simplified78.4%
Taylor expanded in x around inf 78.4%
+-commutative78.4%
associate-/r*78.4%
rec-exp78.4%
+-commutative78.4%
Simplified78.4%
Taylor expanded in wj around 0 77.5%
Taylor expanded in x around 0 77.6%
Taylor expanded in wj around 0 97.6%
if 1.4199999999999999 < wj Initial program 28.6%
distribute-rgt1-in28.6%
associate-/l/28.6%
div-sub28.6%
associate-/l*28.6%
*-inverses100.0%
*-rgt-identity100.0%
Simplified100.0%
Taylor expanded in wj around 0 58.5%
*-commutative58.5%
Simplified58.5%
Taylor expanded in wj around -inf 87.7%
mul-1-neg87.7%
unsub-neg87.7%
mul-1-neg87.7%
unsub-neg87.7%
sub-neg87.7%
distribute-neg-frac87.7%
metadata-eval87.7%
Simplified87.7%
Final simplification97.4%
(FPCore (wj x) :precision binary64 (if (<= wj 3.55) (+ x (* wj (+ (* x -2.0) (* wj (+ 1.0 (* x 2.5)))))) (+ wj (+ -1.0 (/ (+ 1.0 (/ -1.0 wj)) wj)))))
double code(double wj, double x) {
double tmp;
if (wj <= 3.55) {
tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + (x * 2.5)))));
} else {
tmp = wj + (-1.0 + ((1.0 + (-1.0 / wj)) / wj));
}
return tmp;
}
real(8) function code(wj, x)
real(8), intent (in) :: wj
real(8), intent (in) :: x
real(8) :: tmp
if (wj <= 3.55d0) then
tmp = x + (wj * ((x * (-2.0d0)) + (wj * (1.0d0 + (x * 2.5d0)))))
else
tmp = wj + ((-1.0d0) + ((1.0d0 + ((-1.0d0) / wj)) / wj))
end if
code = tmp
end function
public static double code(double wj, double x) {
double tmp;
if (wj <= 3.55) {
tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + (x * 2.5)))));
} else {
tmp = wj + (-1.0 + ((1.0 + (-1.0 / wj)) / wj));
}
return tmp;
}
def code(wj, x): tmp = 0 if wj <= 3.55: tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + (x * 2.5))))) else: tmp = wj + (-1.0 + ((1.0 + (-1.0 / wj)) / wj)) return tmp
function code(wj, x) tmp = 0.0 if (wj <= 3.55) tmp = Float64(x + Float64(wj * Float64(Float64(x * -2.0) + Float64(wj * Float64(1.0 + Float64(x * 2.5)))))); else tmp = Float64(wj + Float64(-1.0 + Float64(Float64(1.0 + Float64(-1.0 / wj)) / wj))); end return tmp end
function tmp_2 = code(wj, x) tmp = 0.0; if (wj <= 3.55) tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + (x * 2.5))))); else tmp = wj + (-1.0 + ((1.0 + (-1.0 / wj)) / wj)); end tmp_2 = tmp; end
code[wj_, x_] := If[LessEqual[wj, 3.55], N[(x + N[(wj * N[(N[(x * -2.0), $MachinePrecision] + N[(wj * N[(1.0 + N[(x * 2.5), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(wj + N[(-1.0 + N[(N[(1.0 + N[(-1.0 / wj), $MachinePrecision]), $MachinePrecision] / wj), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;wj \leq 3.55:\\
\;\;\;\;x + wj \cdot \left(x \cdot -2 + wj \cdot \left(1 + x \cdot 2.5\right)\right)\\
\mathbf{else}:\\
\;\;\;\;wj + \left(-1 + \frac{1 + \frac{-1}{wj}}{wj}\right)\\
\end{array}
\end{array}
if wj < 3.5499999999999998Initial program 77.6%
distribute-rgt1-in78.4%
associate-/l/78.4%
div-sub77.6%
associate-/l*77.6%
*-inverses78.4%
*-rgt-identity78.4%
Simplified78.4%
Taylor expanded in x around inf 78.4%
+-commutative78.4%
associate-/r*78.4%
rec-exp78.4%
+-commutative78.4%
Simplified78.4%
Taylor expanded in wj around 0 77.5%
Taylor expanded in x around 0 77.6%
Taylor expanded in wj around 0 97.6%
if 3.5499999999999998 < wj Initial program 28.6%
distribute-rgt1-in28.6%
associate-/l/28.6%
div-sub28.6%
associate-/l*28.6%
*-inverses100.0%
*-rgt-identity100.0%
Simplified100.0%
Taylor expanded in wj around 0 58.5%
*-commutative58.5%
Simplified58.5%
Taylor expanded in wj around -inf 83.2%
mul-1-neg83.2%
unsub-neg83.2%
sub-neg83.2%
distribute-neg-frac83.2%
metadata-eval83.2%
Simplified83.2%
Final simplification97.2%
(FPCore (wj x) :precision binary64 (if (<= wj 3.15) (- x (* wj (- (* x (- 2.0 (* wj 2.0))) wj))) (+ wj (+ -1.0 (/ (+ 1.0 (/ -1.0 wj)) wj)))))
double code(double wj, double x) {
double tmp;
if (wj <= 3.15) {
tmp = x - (wj * ((x * (2.0 - (wj * 2.0))) - wj));
} else {
tmp = wj + (-1.0 + ((1.0 + (-1.0 / wj)) / wj));
}
return tmp;
}
real(8) function code(wj, x)
real(8), intent (in) :: wj
real(8), intent (in) :: x
real(8) :: tmp
if (wj <= 3.15d0) then
tmp = x - (wj * ((x * (2.0d0 - (wj * 2.0d0))) - wj))
else
tmp = wj + ((-1.0d0) + ((1.0d0 + ((-1.0d0) / wj)) / wj))
end if
code = tmp
end function
public static double code(double wj, double x) {
double tmp;
if (wj <= 3.15) {
tmp = x - (wj * ((x * (2.0 - (wj * 2.0))) - wj));
} else {
tmp = wj + (-1.0 + ((1.0 + (-1.0 / wj)) / wj));
}
return tmp;
}
def code(wj, x): tmp = 0 if wj <= 3.15: tmp = x - (wj * ((x * (2.0 - (wj * 2.0))) - wj)) else: tmp = wj + (-1.0 + ((1.0 + (-1.0 / wj)) / wj)) return tmp
function code(wj, x) tmp = 0.0 if (wj <= 3.15) tmp = Float64(x - Float64(wj * Float64(Float64(x * Float64(2.0 - Float64(wj * 2.0))) - wj))); else tmp = Float64(wj + Float64(-1.0 + Float64(Float64(1.0 + Float64(-1.0 / wj)) / wj))); end return tmp end
function tmp_2 = code(wj, x) tmp = 0.0; if (wj <= 3.15) tmp = x - (wj * ((x * (2.0 - (wj * 2.0))) - wj)); else tmp = wj + (-1.0 + ((1.0 + (-1.0 / wj)) / wj)); end tmp_2 = tmp; end
code[wj_, x_] := If[LessEqual[wj, 3.15], N[(x - N[(wj * N[(N[(x * N[(2.0 - N[(wj * 2.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] - wj), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(wj + N[(-1.0 + N[(N[(1.0 + N[(-1.0 / wj), $MachinePrecision]), $MachinePrecision] / wj), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;wj \leq 3.15:\\
\;\;\;\;x - wj \cdot \left(x \cdot \left(2 - wj \cdot 2\right) - wj\right)\\
\mathbf{else}:\\
\;\;\;\;wj + \left(-1 + \frac{1 + \frac{-1}{wj}}{wj}\right)\\
\end{array}
\end{array}
if wj < 3.14999999999999991Initial program 77.6%
distribute-rgt1-in78.4%
associate-/l/78.4%
div-sub77.6%
associate-/l*77.6%
*-inverses78.4%
*-rgt-identity78.4%
Simplified78.4%
Taylor expanded in wj around 0 77.1%
+-commutative77.1%
Simplified77.1%
Taylor expanded in wj around 0 97.5%
Taylor expanded in x around 0 97.5%
if 3.14999999999999991 < wj Initial program 28.6%
distribute-rgt1-in28.6%
associate-/l/28.6%
div-sub28.6%
associate-/l*28.6%
*-inverses100.0%
*-rgt-identity100.0%
Simplified100.0%
Taylor expanded in wj around 0 58.5%
*-commutative58.5%
Simplified58.5%
Taylor expanded in wj around -inf 83.2%
mul-1-neg83.2%
unsub-neg83.2%
sub-neg83.2%
distribute-neg-frac83.2%
metadata-eval83.2%
Simplified83.2%
Final simplification97.1%
(FPCore (wj x) :precision binary64 (if (<= wj 0.75) (+ x (* -2.0 (* wj x))) (+ wj (+ -1.0 (/ (+ 1.0 (/ -1.0 wj)) wj)))))
double code(double wj, double x) {
double tmp;
if (wj <= 0.75) {
tmp = x + (-2.0 * (wj * x));
} else {
tmp = wj + (-1.0 + ((1.0 + (-1.0 / wj)) / wj));
}
return tmp;
}
real(8) function code(wj, x)
real(8), intent (in) :: wj
real(8), intent (in) :: x
real(8) :: tmp
if (wj <= 0.75d0) then
tmp = x + ((-2.0d0) * (wj * x))
else
tmp = wj + ((-1.0d0) + ((1.0d0 + ((-1.0d0) / wj)) / wj))
end if
code = tmp
end function
public static double code(double wj, double x) {
double tmp;
if (wj <= 0.75) {
tmp = x + (-2.0 * (wj * x));
} else {
tmp = wj + (-1.0 + ((1.0 + (-1.0 / wj)) / wj));
}
return tmp;
}
def code(wj, x): tmp = 0 if wj <= 0.75: tmp = x + (-2.0 * (wj * x)) else: tmp = wj + (-1.0 + ((1.0 + (-1.0 / wj)) / wj)) return tmp
function code(wj, x) tmp = 0.0 if (wj <= 0.75) tmp = Float64(x + Float64(-2.0 * Float64(wj * x))); else tmp = Float64(wj + Float64(-1.0 + Float64(Float64(1.0 + Float64(-1.0 / wj)) / wj))); end return tmp end
function tmp_2 = code(wj, x) tmp = 0.0; if (wj <= 0.75) tmp = x + (-2.0 * (wj * x)); else tmp = wj + (-1.0 + ((1.0 + (-1.0 / wj)) / wj)); end tmp_2 = tmp; end
code[wj_, x_] := If[LessEqual[wj, 0.75], N[(x + N[(-2.0 * N[(wj * x), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(wj + N[(-1.0 + N[(N[(1.0 + N[(-1.0 / wj), $MachinePrecision]), $MachinePrecision] / wj), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;wj \leq 0.75:\\
\;\;\;\;x + -2 \cdot \left(wj \cdot x\right)\\
\mathbf{else}:\\
\;\;\;\;wj + \left(-1 + \frac{1 + \frac{-1}{wj}}{wj}\right)\\
\end{array}
\end{array}
if wj < 0.75Initial program 77.6%
distribute-rgt1-in78.4%
associate-/l/78.4%
div-sub77.6%
associate-/l*77.6%
*-inverses78.4%
*-rgt-identity78.4%
Simplified78.4%
Taylor expanded in wj around 0 88.4%
*-commutative88.4%
Simplified88.4%
if 0.75 < wj Initial program 28.6%
distribute-rgt1-in28.6%
associate-/l/28.6%
div-sub28.6%
associate-/l*28.6%
*-inverses100.0%
*-rgt-identity100.0%
Simplified100.0%
Taylor expanded in wj around 0 58.5%
*-commutative58.5%
Simplified58.5%
Taylor expanded in wj around -inf 83.2%
mul-1-neg83.2%
unsub-neg83.2%
sub-neg83.2%
distribute-neg-frac83.2%
metadata-eval83.2%
Simplified83.2%
Final simplification88.2%
(FPCore (wj x) :precision binary64 (if (<= wj 0.2) (+ x (* -2.0 (* wj x))) (+ wj (- -1.0 (/ -1.0 wj)))))
double code(double wj, double x) {
double tmp;
if (wj <= 0.2) {
tmp = x + (-2.0 * (wj * x));
} else {
tmp = wj + (-1.0 - (-1.0 / wj));
}
return tmp;
}
real(8) function code(wj, x)
real(8), intent (in) :: wj
real(8), intent (in) :: x
real(8) :: tmp
if (wj <= 0.2d0) then
tmp = x + ((-2.0d0) * (wj * x))
else
tmp = wj + ((-1.0d0) - ((-1.0d0) / wj))
end if
code = tmp
end function
public static double code(double wj, double x) {
double tmp;
if (wj <= 0.2) {
tmp = x + (-2.0 * (wj * x));
} else {
tmp = wj + (-1.0 - (-1.0 / wj));
}
return tmp;
}
def code(wj, x): tmp = 0 if wj <= 0.2: tmp = x + (-2.0 * (wj * x)) else: tmp = wj + (-1.0 - (-1.0 / wj)) return tmp
function code(wj, x) tmp = 0.0 if (wj <= 0.2) tmp = Float64(x + Float64(-2.0 * Float64(wj * x))); else tmp = Float64(wj + Float64(-1.0 - Float64(-1.0 / wj))); end return tmp end
function tmp_2 = code(wj, x) tmp = 0.0; if (wj <= 0.2) tmp = x + (-2.0 * (wj * x)); else tmp = wj + (-1.0 - (-1.0 / wj)); end tmp_2 = tmp; end
code[wj_, x_] := If[LessEqual[wj, 0.2], N[(x + N[(-2.0 * N[(wj * x), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(wj + N[(-1.0 - N[(-1.0 / wj), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;wj \leq 0.2:\\
\;\;\;\;x + -2 \cdot \left(wj \cdot x\right)\\
\mathbf{else}:\\
\;\;\;\;wj + \left(-1 - \frac{-1}{wj}\right)\\
\end{array}
\end{array}
if wj < 0.20000000000000001Initial program 77.5%
distribute-rgt1-in78.3%
associate-/l/78.4%
div-sub77.6%
associate-/l*77.6%
*-inverses78.4%
*-rgt-identity78.4%
Simplified78.4%
Taylor expanded in wj around 0 88.7%
*-commutative88.7%
Simplified88.7%
if 0.20000000000000001 < wj Initial program 37.0%
distribute-rgt1-in37.0%
associate-/l/37.5%
div-sub37.5%
associate-/l*37.5%
*-inverses100.0%
*-rgt-identity100.0%
Simplified100.0%
Taylor expanded in wj around 0 63.7%
*-commutative63.7%
Simplified63.7%
Taylor expanded in wj around inf 70.0%
Final simplification88.1%
(FPCore (wj x) :precision binary64 (if (<= wj 0.92) (+ x (* -2.0 (* wj x))) (+ wj -1.0)))
double code(double wj, double x) {
double tmp;
if (wj <= 0.92) {
tmp = x + (-2.0 * (wj * x));
} else {
tmp = wj + -1.0;
}
return tmp;
}
real(8) function code(wj, x)
real(8), intent (in) :: wj
real(8), intent (in) :: x
real(8) :: tmp
if (wj <= 0.92d0) then
tmp = x + ((-2.0d0) * (wj * x))
else
tmp = wj + (-1.0d0)
end if
code = tmp
end function
public static double code(double wj, double x) {
double tmp;
if (wj <= 0.92) {
tmp = x + (-2.0 * (wj * x));
} else {
tmp = wj + -1.0;
}
return tmp;
}
def code(wj, x): tmp = 0 if wj <= 0.92: tmp = x + (-2.0 * (wj * x)) else: tmp = wj + -1.0 return tmp
function code(wj, x) tmp = 0.0 if (wj <= 0.92) tmp = Float64(x + Float64(-2.0 * Float64(wj * x))); else tmp = Float64(wj + -1.0); end return tmp end
function tmp_2 = code(wj, x) tmp = 0.0; if (wj <= 0.92) tmp = x + (-2.0 * (wj * x)); else tmp = wj + -1.0; end tmp_2 = tmp; end
code[wj_, x_] := If[LessEqual[wj, 0.92], N[(x + N[(-2.0 * N[(wj * x), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(wj + -1.0), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;wj \leq 0.92:\\
\;\;\;\;x + -2 \cdot \left(wj \cdot x\right)\\
\mathbf{else}:\\
\;\;\;\;wj + -1\\
\end{array}
\end{array}
if wj < 0.92000000000000004Initial program 77.6%
distribute-rgt1-in78.4%
associate-/l/78.4%
div-sub77.6%
associate-/l*77.6%
*-inverses78.4%
*-rgt-identity78.4%
Simplified78.4%
Taylor expanded in wj around 0 88.4%
*-commutative88.4%
Simplified88.4%
if 0.92000000000000004 < wj Initial program 28.6%
distribute-rgt1-in28.6%
associate-/l/28.6%
div-sub28.6%
associate-/l*28.6%
*-inverses100.0%
*-rgt-identity100.0%
Simplified100.0%
Taylor expanded in wj around inf 63.4%
Taylor expanded in wj around 0 63.4%
Final simplification87.7%
(FPCore (wj x) :precision binary64 (+ wj -1.0))
double code(double wj, double x) {
return wj + -1.0;
}
real(8) function code(wj, x)
real(8), intent (in) :: wj
real(8), intent (in) :: x
code = wj + (-1.0d0)
end function
public static double code(double wj, double x) {
return wj + -1.0;
}
def code(wj, x): return wj + -1.0
function code(wj, x) return Float64(wj + -1.0) end
function tmp = code(wj, x) tmp = wj + -1.0; end
code[wj_, x_] := N[(wj + -1.0), $MachinePrecision]
\begin{array}{l}
\\
wj + -1
\end{array}
Initial program 76.3%
distribute-rgt1-in77.0%
associate-/l/77.1%
div-sub76.3%
associate-/l*76.3%
*-inverses79.0%
*-rgt-identity79.0%
Simplified79.0%
Taylor expanded in wj around inf 5.2%
Taylor expanded in wj around 0 5.2%
Final simplification5.2%
(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 2024179
(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))))))