| Alternative 1 | |
|---|---|
| Accuracy | 99.3% |
| Cost | 15816 |

(FPCore (wj x) :precision binary64 (- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))))
(FPCore (wj x)
:precision binary64
(let* ((t_0 (+ (* x -4.0) (* x 1.5))))
(if (<= wj -0.00013)
(/ (* (exp (- wj)) x) (+ wj 1.0))
(if (<= wj 0.049)
(+
(*
(pow wj 3.0)
(- (- (- -1.0 (* -2.0 t_0)) (* x -3.0)) (* x 0.6666666666666666)))
(+ (* (- 1.0 t_0) (pow wj 2.0)) (+ x (* -2.0 (* wj x)))))
(- wj (/ wj (+ wj 1.0)))))))double code(double wj, double x) {
return wj - (((wj * exp(wj)) - x) / (exp(wj) + (wj * exp(wj))));
}
double code(double wj, double x) {
double t_0 = (x * -4.0) + (x * 1.5);
double tmp;
if (wj <= -0.00013) {
tmp = (exp(-wj) * x) / (wj + 1.0);
} else if (wj <= 0.049) {
tmp = (pow(wj, 3.0) * (((-1.0 - (-2.0 * t_0)) - (x * -3.0)) - (x * 0.6666666666666666))) + (((1.0 - t_0) * pow(wj, 2.0)) + (x + (-2.0 * (wj * x))));
} else {
tmp = wj - (wj / (wj + 1.0));
}
return tmp;
}
real(8) function code(wj, x)
real(8), intent (in) :: wj
real(8), intent (in) :: x
code = wj - (((wj * exp(wj)) - x) / (exp(wj) + (wj * exp(wj))))
end function
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 = (x * (-4.0d0)) + (x * 1.5d0)
if (wj <= (-0.00013d0)) then
tmp = (exp(-wj) * x) / (wj + 1.0d0)
else if (wj <= 0.049d0) then
tmp = ((wj ** 3.0d0) * ((((-1.0d0) - ((-2.0d0) * t_0)) - (x * (-3.0d0))) - (x * 0.6666666666666666d0))) + (((1.0d0 - t_0) * (wj ** 2.0d0)) + (x + ((-2.0d0) * (wj * x))))
else
tmp = wj - (wj / (wj + 1.0d0))
end if
code = tmp
end function
public static double code(double wj, double x) {
return wj - (((wj * Math.exp(wj)) - x) / (Math.exp(wj) + (wj * Math.exp(wj))));
}
public static double code(double wj, double x) {
double t_0 = (x * -4.0) + (x * 1.5);
double tmp;
if (wj <= -0.00013) {
tmp = (Math.exp(-wj) * x) / (wj + 1.0);
} else if (wj <= 0.049) {
tmp = (Math.pow(wj, 3.0) * (((-1.0 - (-2.0 * t_0)) - (x * -3.0)) - (x * 0.6666666666666666))) + (((1.0 - t_0) * Math.pow(wj, 2.0)) + (x + (-2.0 * (wj * x))));
} else {
tmp = wj - (wj / (wj + 1.0));
}
return tmp;
}
def code(wj, x): return wj - (((wj * math.exp(wj)) - x) / (math.exp(wj) + (wj * math.exp(wj))))
def code(wj, x): t_0 = (x * -4.0) + (x * 1.5) tmp = 0 if wj <= -0.00013: tmp = (math.exp(-wj) * x) / (wj + 1.0) elif wj <= 0.049: tmp = (math.pow(wj, 3.0) * (((-1.0 - (-2.0 * t_0)) - (x * -3.0)) - (x * 0.6666666666666666))) + (((1.0 - t_0) * math.pow(wj, 2.0)) + (x + (-2.0 * (wj * x)))) else: tmp = wj - (wj / (wj + 1.0)) return tmp
function code(wj, x) return Float64(wj - Float64(Float64(Float64(wj * exp(wj)) - x) / Float64(exp(wj) + Float64(wj * exp(wj))))) end
function code(wj, x) t_0 = Float64(Float64(x * -4.0) + Float64(x * 1.5)) tmp = 0.0 if (wj <= -0.00013) tmp = Float64(Float64(exp(Float64(-wj)) * x) / Float64(wj + 1.0)); elseif (wj <= 0.049) tmp = Float64(Float64((wj ^ 3.0) * Float64(Float64(Float64(-1.0 - Float64(-2.0 * t_0)) - Float64(x * -3.0)) - Float64(x * 0.6666666666666666))) + Float64(Float64(Float64(1.0 - t_0) * (wj ^ 2.0)) + Float64(x + Float64(-2.0 * Float64(wj * x))))); else tmp = Float64(wj - Float64(wj / Float64(wj + 1.0))); end return tmp end
function tmp = code(wj, x) tmp = wj - (((wj * exp(wj)) - x) / (exp(wj) + (wj * exp(wj)))); end
function tmp_2 = code(wj, x) t_0 = (x * -4.0) + (x * 1.5); tmp = 0.0; if (wj <= -0.00013) tmp = (exp(-wj) * x) / (wj + 1.0); elseif (wj <= 0.049) tmp = ((wj ^ 3.0) * (((-1.0 - (-2.0 * t_0)) - (x * -3.0)) - (x * 0.6666666666666666))) + (((1.0 - t_0) * (wj ^ 2.0)) + (x + (-2.0 * (wj * x)))); else tmp = wj - (wj / (wj + 1.0)); end tmp_2 = tmp; end
code[wj_, x_] := N[(wj - N[(N[(N[(wj * N[Exp[wj], $MachinePrecision]), $MachinePrecision] - x), $MachinePrecision] / N[(N[Exp[wj], $MachinePrecision] + N[(wj * N[Exp[wj], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
code[wj_, x_] := Block[{t$95$0 = N[(N[(x * -4.0), $MachinePrecision] + N[(x * 1.5), $MachinePrecision]), $MachinePrecision]}, If[LessEqual[wj, -0.00013], N[(N[(N[Exp[(-wj)], $MachinePrecision] * x), $MachinePrecision] / N[(wj + 1.0), $MachinePrecision]), $MachinePrecision], If[LessEqual[wj, 0.049], N[(N[(N[Power[wj, 3.0], $MachinePrecision] * N[(N[(N[(-1.0 - N[(-2.0 * t$95$0), $MachinePrecision]), $MachinePrecision] - N[(x * -3.0), $MachinePrecision]), $MachinePrecision] - N[(x * 0.6666666666666666), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[(N[(N[(1.0 - t$95$0), $MachinePrecision] * N[Power[wj, 2.0], $MachinePrecision]), $MachinePrecision] + N[(x + N[(-2.0 * N[(wj * x), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(wj - N[(wj / N[(wj + 1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]]
wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}
\begin{array}{l}
t_0 := x \cdot -4 + x \cdot 1.5\\
\mathbf{if}\;wj \leq -0.00013:\\
\;\;\;\;\frac{e^{-wj} \cdot x}{wj + 1}\\
\mathbf{elif}\;wj \leq 0.049:\\
\;\;\;\;{wj}^{3} \cdot \left(\left(\left(-1 - -2 \cdot t_0\right) - x \cdot -3\right) - x \cdot 0.6666666666666666\right) + \left(\left(1 - t_0\right) \cdot {wj}^{2} + \left(x + -2 \cdot \left(wj \cdot x\right)\right)\right)\\
\mathbf{else}:\\
\;\;\;\;wj - \frac{wj}{wj + 1}\\
\end{array}
Herbie found 20 alternatives:
| Alternative | Accuracy | Speedup |
|---|
Results
| Original | 39.7% |
|---|---|
| Target | 64.2% |
| Herbie | 99.3% |
if wj < -1.29999999999999989e-4Initial program 2.6%
Simplified100.0%
[Start]2.6% | \[ wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}
\] |
|---|---|
sub-neg [=>]2.6% | \[ \color{blue}{wj + \left(-\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\right)}
\] |
div-sub [=>]2.6% | \[ wj + \left(-\color{blue}{\left(\frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}} - \frac{x}{e^{wj} + wj \cdot e^{wj}}\right)}\right)
\] |
sub-neg [=>]2.6% | \[ wj + \left(-\color{blue}{\left(\frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}} + \left(-\frac{x}{e^{wj} + wj \cdot e^{wj}}\right)\right)}\right)
\] |
+-commutative [=>]2.6% | \[ wj + \left(-\color{blue}{\left(\left(-\frac{x}{e^{wj} + wj \cdot e^{wj}}\right) + \frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}}\right)}\right)
\] |
distribute-neg-in [=>]2.6% | \[ wj + \color{blue}{\left(\left(-\left(-\frac{x}{e^{wj} + wj \cdot e^{wj}}\right)\right) + \left(-\frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}}\right)\right)}
\] |
remove-double-neg [=>]2.6% | \[ wj + \left(\color{blue}{\frac{x}{e^{wj} + wj \cdot e^{wj}}} + \left(-\frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}}\right)\right)
\] |
sub-neg [<=]2.6% | \[ wj + \color{blue}{\left(\frac{x}{e^{wj} + wj \cdot e^{wj}} - \frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}}\right)}
\] |
div-sub [<=]2.6% | \[ wj + \color{blue}{\frac{x - wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}}}
\] |
distribute-rgt1-in [=>]100.0% | \[ wj + \frac{x - wj \cdot e^{wj}}{\color{blue}{\left(wj + 1\right) \cdot e^{wj}}}
\] |
associate-/l/ [<=]100.0% | \[ wj + \color{blue}{\frac{\frac{x - wj \cdot e^{wj}}{e^{wj}}}{wj + 1}}
\] |
Applied egg-rr100.0%
[Start]100.0% | \[ wj + \frac{\frac{x}{e^{wj}} - wj}{wj + 1}
\] |
|---|---|
clear-num [=>]100.0% | \[ wj + \frac{\color{blue}{\frac{1}{\frac{e^{wj}}{x}}} - wj}{wj + 1}
\] |
associate-/r/ [=>]100.0% | \[ wj + \frac{\color{blue}{\frac{1}{e^{wj}} \cdot x} - wj}{wj + 1}
\] |
rec-exp [=>]100.0% | \[ wj + \frac{\color{blue}{e^{-wj}} \cdot x - wj}{wj + 1}
\] |
Taylor expanded in x around inf 100.0%
if -1.29999999999999989e-4 < wj < 0.049000000000000002Initial program 79.0%
Simplified79.0%
[Start]79.0% | \[ wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}
\] |
|---|---|
sub-neg [=>]79.0% | \[ \color{blue}{wj + \left(-\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\right)}
\] |
div-sub [=>]79.0% | \[ wj + \left(-\color{blue}{\left(\frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}} - \frac{x}{e^{wj} + wj \cdot e^{wj}}\right)}\right)
\] |
sub-neg [=>]79.0% | \[ wj + \left(-\color{blue}{\left(\frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}} + \left(-\frac{x}{e^{wj} + wj \cdot e^{wj}}\right)\right)}\right)
\] |
+-commutative [=>]79.0% | \[ wj + \left(-\color{blue}{\left(\left(-\frac{x}{e^{wj} + wj \cdot e^{wj}}\right) + \frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}}\right)}\right)
\] |
distribute-neg-in [=>]79.0% | \[ wj + \color{blue}{\left(\left(-\left(-\frac{x}{e^{wj} + wj \cdot e^{wj}}\right)\right) + \left(-\frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}}\right)\right)}
\] |
remove-double-neg [=>]79.0% | \[ wj + \left(\color{blue}{\frac{x}{e^{wj} + wj \cdot e^{wj}}} + \left(-\frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}}\right)\right)
\] |
sub-neg [<=]79.0% | \[ wj + \color{blue}{\left(\frac{x}{e^{wj} + wj \cdot e^{wj}} - \frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}}\right)}
\] |
div-sub [<=]79.0% | \[ wj + \color{blue}{\frac{x - wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}}}
\] |
distribute-rgt1-in [=>]79.0% | \[ wj + \frac{x - wj \cdot e^{wj}}{\color{blue}{\left(wj + 1\right) \cdot e^{wj}}}
\] |
associate-/l/ [<=]79.0% | \[ wj + \color{blue}{\frac{\frac{x - wj \cdot e^{wj}}{e^{wj}}}{wj + 1}}
\] |
Taylor expanded in wj around 0 99.9%
if 0.049000000000000002 < wj Initial program 0.0%
Simplified100.0%
[Start]0.0% | \[ wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}
\] |
|---|---|
sub-neg [=>]0.0% | \[ \color{blue}{wj + \left(-\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\right)}
\] |
div-sub [=>]0.0% | \[ wj + \left(-\color{blue}{\left(\frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}} - \frac{x}{e^{wj} + wj \cdot e^{wj}}\right)}\right)
\] |
sub-neg [=>]0.0% | \[ wj + \left(-\color{blue}{\left(\frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}} + \left(-\frac{x}{e^{wj} + wj \cdot e^{wj}}\right)\right)}\right)
\] |
+-commutative [=>]0.0% | \[ wj + \left(-\color{blue}{\left(\left(-\frac{x}{e^{wj} + wj \cdot e^{wj}}\right) + \frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}}\right)}\right)
\] |
distribute-neg-in [=>]0.0% | \[ wj + \color{blue}{\left(\left(-\left(-\frac{x}{e^{wj} + wj \cdot e^{wj}}\right)\right) + \left(-\frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}}\right)\right)}
\] |
remove-double-neg [=>]0.0% | \[ wj + \left(\color{blue}{\frac{x}{e^{wj} + wj \cdot e^{wj}}} + \left(-\frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}}\right)\right)
\] |
sub-neg [<=]0.0% | \[ wj + \color{blue}{\left(\frac{x}{e^{wj} + wj \cdot e^{wj}} - \frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}}\right)}
\] |
div-sub [<=]0.0% | \[ wj + \color{blue}{\frac{x - wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}}}
\] |
distribute-rgt1-in [=>]0.0% | \[ wj + \frac{x - wj \cdot e^{wj}}{\color{blue}{\left(wj + 1\right) \cdot e^{wj}}}
\] |
associate-/l/ [<=]0.0% | \[ wj + \color{blue}{\frac{\frac{x - wj \cdot e^{wj}}{e^{wj}}}{wj + 1}}
\] |
Taylor expanded in x around 0 100.0%
Simplified100.0%
[Start]100.0% | \[ wj - \frac{wj}{1 + wj}
\] |
|---|---|
+-commutative [<=]100.0% | \[ wj - \frac{wj}{\color{blue}{wj + 1}}
\] |
Final simplification99.9%
| Alternative 1 | |
|---|---|
| Accuracy | 99.3% |
| Cost | 15816 |
| Alternative 2 | |
|---|---|
| Accuracy | 99.3% |
| Cost | 7368 |
| Alternative 3 | |
|---|---|
| Accuracy | 98.9% |
| Cost | 7044 |
| Alternative 4 | |
|---|---|
| Accuracy | 98.9% |
| Cost | 6980 |
| Alternative 5 | |
|---|---|
| Accuracy | 98.7% |
| Cost | 6852 |
| Alternative 6 | |
|---|---|
| Accuracy | 82.7% |
| Cost | 1352 |
| Alternative 7 | |
|---|---|
| Accuracy | 82.7% |
| Cost | 968 |
| Alternative 8 | |
|---|---|
| Accuracy | 76.8% |
| Cost | 712 |
| Alternative 9 | |
|---|---|
| Accuracy | 77.0% |
| Cost | 712 |
| Alternative 10 | |
|---|---|
| Accuracy | 77.0% |
| Cost | 712 |
| Alternative 11 | |
|---|---|
| Accuracy | 74.4% |
| Cost | 708 |
| Alternative 12 | |
|---|---|
| Accuracy | 76.5% |
| Cost | 516 |
| Alternative 13 | |
|---|---|
| Accuracy | 74.3% |
| Cost | 456 |
| Alternative 14 | |
|---|---|
| Accuracy | 73.9% |
| Cost | 328 |
| Alternative 15 | |
|---|---|
| Accuracy | 67.4% |
| Cost | 196 |
| Alternative 16 | |
|---|---|
| Accuracy | 2.4% |
| Cost | 64 |
| Alternative 17 | |
|---|---|
| Accuracy | 2.8% |
| Cost | 64 |
| Alternative 18 | |
|---|---|
| Accuracy | 3.8% |
| Cost | 64 |
| Alternative 19 | |
|---|---|
| Accuracy | 3.8% |
| Cost | 64 |
| Alternative 20 | |
|---|---|
| Accuracy | 26.9% |
| Cost | 64 |
herbie shell --seed 2023272
(FPCore (wj x)
:name "Jmat.Real.lambertw, newton loop step"
:precision binary64
:herbie-target
(- wj (- (/ wj (+ wj 1.0)) (/ x (+ (exp wj) (* wj (exp wj))))))
(- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))))