Jmat.Real.lambertw, newton loop step

Percentage Accurate: 77.9% → 98.5%
Time: 14.4s
Alternatives: 13
Speedup: 313.0×

Specification

?
\[\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)))) (- 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:

Local Percentage Accuracy vs ?

The average percentage accuracy by input value. Horizontal axis shows value of an input variable; the variable is choosen in the title. Vertical axis is accuracy; higher is better. Red represent the original program, while blue represents Herbie's suggestion. These can be toggled with buttons below the plot. The line is an average while dots represent individual samples.

Accuracy vs Speed?

Herbie found 13 alternatives:

AlternativeAccuracySpeedup
The accuracy (vertical axis) and speed (horizontal axis) of each alternatives. Up and to the right is better. The red square shows the initial program, and each blue circle shows an alternative.The line shows the best available speed-accuracy tradeoffs.

Initial Program: 77.9% accurate, 1.0× speedup?

\[\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)))) (- 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}

Alternative 1: 98.5% accurate, 0.6× speedup?

\[\begin{array}{l} \\ \begin{array}{l} t_0 := wj - \frac{x}{e^{wj}}\\ t_1 := -1 - wj \cdot \left(wj \cdot wj\right)\\ t_2 := wj \cdot e^{wj}\\ \mathbf{if}\;wj + \frac{x - t\_2}{e^{wj} + t\_2} \leq 10^{-21}:\\ \;\;\;\;x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 + wj \cdot \left(\left(-1 - x \cdot -3\right) - \left(x \cdot 5 + x \cdot 0.6666666666666666\right)\right)\right) + x \cdot 2.5\right)\right)\\ \mathbf{else}:\\ \;\;\;\;\left(wj + \frac{t\_0}{t\_1}\right) + \frac{wj \cdot \left(wj + -1\right)}{\frac{t\_1}{t\_0}}\\ \end{array} \end{array} \]
(FPCore (wj x)
 :precision binary64
 (let* ((t_0 (- wj (/ x (exp wj))))
        (t_1 (- -1.0 (* wj (* wj wj))))
        (t_2 (* wj (exp wj))))
   (if (<= (+ wj (/ (- x t_2) (+ (exp wj) t_2))) 1e-21)
     (+
      x
      (*
       wj
       (+
        (* x -2.0)
        (*
         wj
         (+
          (+
           1.0
           (*
            wj
            (- (- -1.0 (* x -3.0)) (+ (* x 5.0) (* x 0.6666666666666666)))))
          (* x 2.5))))))
     (+ (+ wj (/ t_0 t_1)) (/ (* wj (+ wj -1.0)) (/ t_1 t_0))))))
double code(double wj, double x) {
	double t_0 = wj - (x / exp(wj));
	double t_1 = -1.0 - (wj * (wj * wj));
	double t_2 = wj * exp(wj);
	double tmp;
	if ((wj + ((x - t_2) / (exp(wj) + t_2))) <= 1e-21) {
		tmp = x + (wj * ((x * -2.0) + (wj * ((1.0 + (wj * ((-1.0 - (x * -3.0)) - ((x * 5.0) + (x * 0.6666666666666666))))) + (x * 2.5)))));
	} else {
		tmp = (wj + (t_0 / t_1)) + ((wj * (wj + -1.0)) / (t_1 / t_0));
	}
	return tmp;
}
real(8) function code(wj, x)
    real(8), intent (in) :: wj
    real(8), intent (in) :: x
    real(8) :: t_0
    real(8) :: t_1
    real(8) :: t_2
    real(8) :: tmp
    t_0 = wj - (x / exp(wj))
    t_1 = (-1.0d0) - (wj * (wj * wj))
    t_2 = wj * exp(wj)
    if ((wj + ((x - t_2) / (exp(wj) + t_2))) <= 1d-21) then
        tmp = x + (wj * ((x * (-2.0d0)) + (wj * ((1.0d0 + (wj * (((-1.0d0) - (x * (-3.0d0))) - ((x * 5.0d0) + (x * 0.6666666666666666d0))))) + (x * 2.5d0)))))
    else
        tmp = (wj + (t_0 / t_1)) + ((wj * (wj + (-1.0d0))) / (t_1 / t_0))
    end if
    code = tmp
end function
public static double code(double wj, double x) {
	double t_0 = wj - (x / Math.exp(wj));
	double t_1 = -1.0 - (wj * (wj * wj));
	double t_2 = wj * Math.exp(wj);
	double tmp;
	if ((wj + ((x - t_2) / (Math.exp(wj) + t_2))) <= 1e-21) {
		tmp = x + (wj * ((x * -2.0) + (wj * ((1.0 + (wj * ((-1.0 - (x * -3.0)) - ((x * 5.0) + (x * 0.6666666666666666))))) + (x * 2.5)))));
	} else {
		tmp = (wj + (t_0 / t_1)) + ((wj * (wj + -1.0)) / (t_1 / t_0));
	}
	return tmp;
}
def code(wj, x):
	t_0 = wj - (x / math.exp(wj))
	t_1 = -1.0 - (wj * (wj * wj))
	t_2 = wj * math.exp(wj)
	tmp = 0
	if (wj + ((x - t_2) / (math.exp(wj) + t_2))) <= 1e-21:
		tmp = x + (wj * ((x * -2.0) + (wj * ((1.0 + (wj * ((-1.0 - (x * -3.0)) - ((x * 5.0) + (x * 0.6666666666666666))))) + (x * 2.5)))))
	else:
		tmp = (wj + (t_0 / t_1)) + ((wj * (wj + -1.0)) / (t_1 / t_0))
	return tmp
function code(wj, x)
	t_0 = Float64(wj - Float64(x / exp(wj)))
	t_1 = Float64(-1.0 - Float64(wj * Float64(wj * wj)))
	t_2 = Float64(wj * exp(wj))
	tmp = 0.0
	if (Float64(wj + Float64(Float64(x - t_2) / Float64(exp(wj) + t_2))) <= 1e-21)
		tmp = Float64(x + Float64(wj * Float64(Float64(x * -2.0) + Float64(wj * Float64(Float64(1.0 + Float64(wj * Float64(Float64(-1.0 - Float64(x * -3.0)) - Float64(Float64(x * 5.0) + Float64(x * 0.6666666666666666))))) + Float64(x * 2.5))))));
	else
		tmp = Float64(Float64(wj + Float64(t_0 / t_1)) + Float64(Float64(wj * Float64(wj + -1.0)) / Float64(t_1 / t_0)));
	end
	return tmp
end
function tmp_2 = code(wj, x)
	t_0 = wj - (x / exp(wj));
	t_1 = -1.0 - (wj * (wj * wj));
	t_2 = wj * exp(wj);
	tmp = 0.0;
	if ((wj + ((x - t_2) / (exp(wj) + t_2))) <= 1e-21)
		tmp = x + (wj * ((x * -2.0) + (wj * ((1.0 + (wj * ((-1.0 - (x * -3.0)) - ((x * 5.0) + (x * 0.6666666666666666))))) + (x * 2.5)))));
	else
		tmp = (wj + (t_0 / t_1)) + ((wj * (wj + -1.0)) / (t_1 / t_0));
	end
	tmp_2 = tmp;
end
code[wj_, x_] := Block[{t$95$0 = N[(wj - N[(x / N[Exp[wj], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, Block[{t$95$1 = N[(-1.0 - N[(wj * N[(wj * wj), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, Block[{t$95$2 = N[(wj * N[Exp[wj], $MachinePrecision]), $MachinePrecision]}, If[LessEqual[N[(wj + N[(N[(x - t$95$2), $MachinePrecision] / N[(N[Exp[wj], $MachinePrecision] + t$95$2), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], 1e-21], N[(x + N[(wj * N[(N[(x * -2.0), $MachinePrecision] + N[(wj * N[(N[(1.0 + N[(wj * N[(N[(-1.0 - N[(x * -3.0), $MachinePrecision]), $MachinePrecision] - N[(N[(x * 5.0), $MachinePrecision] + N[(x * 0.6666666666666666), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[(x * 2.5), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(N[(wj + N[(t$95$0 / t$95$1), $MachinePrecision]), $MachinePrecision] + N[(N[(wj * N[(wj + -1.0), $MachinePrecision]), $MachinePrecision] / N[(t$95$1 / t$95$0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]]]
\begin{array}{l}

\\
\begin{array}{l}
t_0 := wj - \frac{x}{e^{wj}}\\
t_1 := -1 - wj \cdot \left(wj \cdot wj\right)\\
t_2 := wj \cdot e^{wj}\\
\mathbf{if}\;wj + \frac{x - t\_2}{e^{wj} + t\_2} \leq 10^{-21}:\\
\;\;\;\;x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 + wj \cdot \left(\left(-1 - x \cdot -3\right) - \left(x \cdot 5 + x \cdot 0.6666666666666666\right)\right)\right) + x \cdot 2.5\right)\right)\\

\mathbf{else}:\\
\;\;\;\;\left(wj + \frac{t\_0}{t\_1}\right) + \frac{wj \cdot \left(wj + -1\right)}{\frac{t\_1}{t\_0}}\\


\end{array}
\end{array}
Derivation
  1. Split input into 2 regimes
  2. if (-.f64 wj (/.f64 (-.f64 (*.f64 wj (exp.f64 wj)) x) (+.f64 (exp.f64 wj) (*.f64 wj (exp.f64 wj))))) < 9.99999999999999908e-22

    1. Initial program 69.5%

      \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
    2. Add Preprocessing
    3. Taylor expanded in wj around 0

      \[\leadsto \color{blue}{x + wj \cdot \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)} \]
    4. Step-by-step derivation
      1. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(x, \color{blue}{\left(wj \cdot \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)\right)}\right) \]
      2. *-lowering-*.f64N/A

        \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \color{blue}{\left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)}\right)\right) \]
      3. cancel-sign-sub-invN/A

        \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + \color{blue}{\left(\mathsf{neg}\left(2\right)\right) \cdot x}\right)\right)\right) \]
      4. metadata-evalN/A

        \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + -2 \cdot x\right)\right)\right) \]
      5. +-commutativeN/A

        \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(-2 \cdot x + \color{blue}{wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)}\right)\right)\right) \]
      6. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\left(-2 \cdot x\right), \color{blue}{\left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)\right)}\right)\right)\right) \]
    5. Simplified99.4%

      \[\leadsto \color{blue}{x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 - wj \cdot \left(\left(x \cdot 5 + x \cdot 0.6666666666666666\right) + \left(1 + x \cdot -3\right)\right)\right) + x \cdot 2.5\right)\right)} \]

    if 9.99999999999999908e-22 < (-.f64 wj (/.f64 (-.f64 (*.f64 wj (exp.f64 wj)) x) (+.f64 (exp.f64 wj) (*.f64 wj (exp.f64 wj)))))

    1. Initial program 94.7%

      \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
    2. Step-by-step derivation
      1. sub-negN/A

        \[\leadsto wj + \color{blue}{\left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\right)\right)} \]
      2. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \color{blue}{\left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\right)\right)}\right) \]
      3. distribute-rgt1-inN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{\left(wj + 1\right) \cdot e^{wj}}\right)\right)\right) \]
      4. associate-/l/N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \left(\mathsf{neg}\left(\frac{\frac{wj \cdot e^{wj} - x}{e^{wj}}}{wj + 1}\right)\right)\right) \]
      5. distribute-neg-frac2N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \left(\frac{\frac{wj \cdot e^{wj} - x}{e^{wj}}}{\color{blue}{\mathsf{neg}\left(\left(wj + 1\right)\right)}}\right)\right) \]
      6. /-lowering-/.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(\frac{wj \cdot e^{wj} - x}{e^{wj}}\right), \color{blue}{\left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)}\right)\right) \]
      7. div-subN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(\frac{wj \cdot e^{wj}}{e^{wj}} - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\color{blue}{\left(wj + 1\right)}\right)\right)\right)\right) \]
      8. associate-/l*N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj \cdot \frac{e^{wj}}{e^{wj}} - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(\color{blue}{wj} + 1\right)\right)\right)\right)\right) \]
      9. *-inversesN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj \cdot 1 - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)\right)\right) \]
      10. *-rgt-identityN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(\color{blue}{wj} + 1\right)\right)\right)\right)\right) \]
      11. --lowering--.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \left(\frac{x}{e^{wj}}\right)\right), \left(\mathsf{neg}\left(\color{blue}{\left(wj + 1\right)}\right)\right)\right)\right) \]
      12. /-lowering-/.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \left(e^{wj}\right)\right)\right), \left(\mathsf{neg}\left(\left(wj + \color{blue}{1}\right)\right)\right)\right)\right) \]
      13. exp-lowering-exp.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)\right)\right) \]
      14. +-commutativeN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(1 + wj\right)\right)\right)\right)\right) \]
      15. *-inversesN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(\frac{e^{wj}}{e^{wj}} + wj\right)\right)\right)\right)\right) \]
      16. distribute-neg-inN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\left(\mathsf{neg}\left(\frac{e^{wj}}{e^{wj}}\right)\right) + \color{blue}{\left(\mathsf{neg}\left(wj\right)\right)}\right)\right)\right) \]
    3. Simplified99.4%

      \[\leadsto \color{blue}{wj + \frac{wj - \frac{x}{e^{wj}}}{-1 - wj}} \]
    4. Add Preprocessing
    5. Step-by-step derivation
      1. +-commutativeN/A

        \[\leadsto \frac{wj - \frac{x}{e^{wj}}}{-1 - wj} + \color{blue}{wj} \]
      2. flip3--N/A

        \[\leadsto \frac{wj - \frac{x}{e^{wj}}}{\frac{{-1}^{3} - {wj}^{3}}{-1 \cdot -1 + \left(wj \cdot wj + -1 \cdot wj\right)}} + wj \]
      3. associate-/r/N/A

        \[\leadsto \frac{wj - \frac{x}{e^{wj}}}{{-1}^{3} - {wj}^{3}} \cdot \left(-1 \cdot -1 + \left(wj \cdot wj + -1 \cdot wj\right)\right) + wj \]
      4. fma-defineN/A

        \[\leadsto \mathsf{fma}\left(\frac{wj - \frac{x}{e^{wj}}}{{-1}^{3} - {wj}^{3}}, \color{blue}{-1 \cdot -1 + \left(wj \cdot wj + -1 \cdot wj\right)}, wj\right) \]
      5. fma-lowering-fma.f64N/A

        \[\leadsto \mathsf{fma.f64}\left(\left(\frac{wj - \frac{x}{e^{wj}}}{{-1}^{3} - {wj}^{3}}\right), \color{blue}{\left(-1 \cdot -1 + \left(wj \cdot wj + -1 \cdot wj\right)\right)}, wj\right) \]
    6. Applied egg-rr99.3%

      \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{wj - \frac{x}{e^{wj}}}{-1 - wj \cdot \left(wj \cdot wj\right)}, 1 + wj \cdot \left(wj + -1\right), wj\right)} \]
    7. Step-by-step derivation
      1. +-commutativeN/A

        \[\leadsto wj + \color{blue}{\frac{wj - \frac{x}{e^{wj}}}{-1 - wj \cdot \left(wj \cdot wj\right)} \cdot \left(1 + wj \cdot \left(wj + -1\right)\right)} \]
      2. distribute-lft-inN/A

        \[\leadsto wj + \left(\frac{wj - \frac{x}{e^{wj}}}{-1 - wj \cdot \left(wj \cdot wj\right)} \cdot 1 + \color{blue}{\frac{wj - \frac{x}{e^{wj}}}{-1 - wj \cdot \left(wj \cdot wj\right)} \cdot \left(wj \cdot \left(wj + -1\right)\right)}\right) \]
      3. *-rgt-identityN/A

        \[\leadsto wj + \left(\frac{wj - \frac{x}{e^{wj}}}{-1 - wj \cdot \left(wj \cdot wj\right)} + \color{blue}{\frac{wj - \frac{x}{e^{wj}}}{-1 - wj \cdot \left(wj \cdot wj\right)}} \cdot \left(wj \cdot \left(wj + -1\right)\right)\right) \]
      4. associate-+r+N/A

        \[\leadsto \left(wj + \frac{wj - \frac{x}{e^{wj}}}{-1 - wj \cdot \left(wj \cdot wj\right)}\right) + \color{blue}{\frac{wj - \frac{x}{e^{wj}}}{-1 - wj \cdot \left(wj \cdot wj\right)} \cdot \left(wj \cdot \left(wj + -1\right)\right)} \]
      5. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(\left(wj + \frac{wj - \frac{x}{e^{wj}}}{-1 - wj \cdot \left(wj \cdot wj\right)}\right), \color{blue}{\left(\frac{wj - \frac{x}{e^{wj}}}{-1 - wj \cdot \left(wj \cdot wj\right)} \cdot \left(wj \cdot \left(wj + -1\right)\right)\right)}\right) \]
    8. Applied egg-rr99.4%

      \[\leadsto \color{blue}{\left(wj + \frac{wj - \frac{x}{e^{wj}}}{-1 - wj \cdot \left(wj \cdot wj\right)}\right) + \frac{wj \cdot \left(wj + -1\right)}{\frac{-1 - wj \cdot \left(wj \cdot wj\right)}{wj - \frac{x}{e^{wj}}}}} \]
  3. Recombined 2 regimes into one program.
  4. Final simplification99.4%

    \[\leadsto \begin{array}{l} \mathbf{if}\;wj + \frac{x - wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}} \leq 10^{-21}:\\ \;\;\;\;x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 + wj \cdot \left(\left(-1 - x \cdot -3\right) - \left(x \cdot 5 + x \cdot 0.6666666666666666\right)\right)\right) + x \cdot 2.5\right)\right)\\ \mathbf{else}:\\ \;\;\;\;\left(wj + \frac{wj - \frac{x}{e^{wj}}}{-1 - wj \cdot \left(wj \cdot wj\right)}\right) + \frac{wj \cdot \left(wj + -1\right)}{\frac{-1 - wj \cdot \left(wj \cdot wj\right)}{wj - \frac{x}{e^{wj}}}}\\ \end{array} \]
  5. Add Preprocessing

Alternative 2: 98.1% accurate, 2.7× speedup?

\[\begin{array}{l} \\ \begin{array}{l} \mathbf{if}\;wj \leq -4.6 \cdot 10^{-6}:\\ \;\;\;\;wj + \frac{wj - \frac{x}{e^{wj}}}{-1 - wj}\\ \mathbf{else}:\\ \;\;\;\;x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 + wj \cdot \left(\left(-1 - x \cdot -3\right) - \left(x \cdot 5 + x \cdot 0.6666666666666666\right)\right)\right) + x \cdot 2.5\right)\right)\\ \end{array} \end{array} \]
(FPCore (wj x)
 :precision binary64
 (if (<= wj -4.6e-6)
   (+ wj (/ (- wj (/ x (exp wj))) (- -1.0 wj)))
   (+
    x
    (*
     wj
     (+
      (* x -2.0)
      (*
       wj
       (+
        (+
         1.0
         (* wj (- (- -1.0 (* x -3.0)) (+ (* x 5.0) (* x 0.6666666666666666)))))
        (* x 2.5))))))))
double code(double wj, double x) {
	double tmp;
	if (wj <= -4.6e-6) {
		tmp = wj + ((wj - (x / exp(wj))) / (-1.0 - wj));
	} else {
		tmp = x + (wj * ((x * -2.0) + (wj * ((1.0 + (wj * ((-1.0 - (x * -3.0)) - ((x * 5.0) + (x * 0.6666666666666666))))) + (x * 2.5)))));
	}
	return tmp;
}
real(8) function code(wj, x)
    real(8), intent (in) :: wj
    real(8), intent (in) :: x
    real(8) :: tmp
    if (wj <= (-4.6d-6)) then
        tmp = wj + ((wj - (x / exp(wj))) / ((-1.0d0) - wj))
    else
        tmp = x + (wj * ((x * (-2.0d0)) + (wj * ((1.0d0 + (wj * (((-1.0d0) - (x * (-3.0d0))) - ((x * 5.0d0) + (x * 0.6666666666666666d0))))) + (x * 2.5d0)))))
    end if
    code = tmp
end function
public static double code(double wj, double x) {
	double tmp;
	if (wj <= -4.6e-6) {
		tmp = wj + ((wj - (x / Math.exp(wj))) / (-1.0 - wj));
	} else {
		tmp = x + (wj * ((x * -2.0) + (wj * ((1.0 + (wj * ((-1.0 - (x * -3.0)) - ((x * 5.0) + (x * 0.6666666666666666))))) + (x * 2.5)))));
	}
	return tmp;
}
def code(wj, x):
	tmp = 0
	if wj <= -4.6e-6:
		tmp = wj + ((wj - (x / math.exp(wj))) / (-1.0 - wj))
	else:
		tmp = x + (wj * ((x * -2.0) + (wj * ((1.0 + (wj * ((-1.0 - (x * -3.0)) - ((x * 5.0) + (x * 0.6666666666666666))))) + (x * 2.5)))))
	return tmp
function code(wj, x)
	tmp = 0.0
	if (wj <= -4.6e-6)
		tmp = Float64(wj + Float64(Float64(wj - Float64(x / exp(wj))) / Float64(-1.0 - wj)));
	else
		tmp = Float64(x + Float64(wj * Float64(Float64(x * -2.0) + Float64(wj * Float64(Float64(1.0 + Float64(wj * Float64(Float64(-1.0 - Float64(x * -3.0)) - Float64(Float64(x * 5.0) + Float64(x * 0.6666666666666666))))) + Float64(x * 2.5))))));
	end
	return tmp
end
function tmp_2 = code(wj, x)
	tmp = 0.0;
	if (wj <= -4.6e-6)
		tmp = wj + ((wj - (x / exp(wj))) / (-1.0 - wj));
	else
		tmp = x + (wj * ((x * -2.0) + (wj * ((1.0 + (wj * ((-1.0 - (x * -3.0)) - ((x * 5.0) + (x * 0.6666666666666666))))) + (x * 2.5)))));
	end
	tmp_2 = tmp;
end
code[wj_, x_] := If[LessEqual[wj, -4.6e-6], N[(wj + N[(N[(wj - N[(x / N[Exp[wj], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(-1.0 - wj), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(x + N[(wj * N[(N[(x * -2.0), $MachinePrecision] + N[(wj * N[(N[(1.0 + N[(wj * N[(N[(-1.0 - N[(x * -3.0), $MachinePrecision]), $MachinePrecision] - N[(N[(x * 5.0), $MachinePrecision] + N[(x * 0.6666666666666666), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[(x * 2.5), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}

\\
\begin{array}{l}
\mathbf{if}\;wj \leq -4.6 \cdot 10^{-6}:\\
\;\;\;\;wj + \frac{wj - \frac{x}{e^{wj}}}{-1 - wj}\\

\mathbf{else}:\\
\;\;\;\;x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 + wj \cdot \left(\left(-1 - x \cdot -3\right) - \left(x \cdot 5 + x \cdot 0.6666666666666666\right)\right)\right) + x \cdot 2.5\right)\right)\\


\end{array}
\end{array}
Derivation
  1. Split input into 2 regimes
  2. if wj < -4.6e-6

    1. Initial program 71.1%

      \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
    2. Step-by-step derivation
      1. sub-negN/A

        \[\leadsto wj + \color{blue}{\left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\right)\right)} \]
      2. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \color{blue}{\left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\right)\right)}\right) \]
      3. distribute-rgt1-inN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{\left(wj + 1\right) \cdot e^{wj}}\right)\right)\right) \]
      4. associate-/l/N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \left(\mathsf{neg}\left(\frac{\frac{wj \cdot e^{wj} - x}{e^{wj}}}{wj + 1}\right)\right)\right) \]
      5. distribute-neg-frac2N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \left(\frac{\frac{wj \cdot e^{wj} - x}{e^{wj}}}{\color{blue}{\mathsf{neg}\left(\left(wj + 1\right)\right)}}\right)\right) \]
      6. /-lowering-/.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(\frac{wj \cdot e^{wj} - x}{e^{wj}}\right), \color{blue}{\left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)}\right)\right) \]
      7. div-subN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(\frac{wj \cdot e^{wj}}{e^{wj}} - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\color{blue}{\left(wj + 1\right)}\right)\right)\right)\right) \]
      8. associate-/l*N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj \cdot \frac{e^{wj}}{e^{wj}} - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(\color{blue}{wj} + 1\right)\right)\right)\right)\right) \]
      9. *-inversesN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj \cdot 1 - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)\right)\right) \]
      10. *-rgt-identityN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(\color{blue}{wj} + 1\right)\right)\right)\right)\right) \]
      11. --lowering--.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \left(\frac{x}{e^{wj}}\right)\right), \left(\mathsf{neg}\left(\color{blue}{\left(wj + 1\right)}\right)\right)\right)\right) \]
      12. /-lowering-/.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \left(e^{wj}\right)\right)\right), \left(\mathsf{neg}\left(\left(wj + \color{blue}{1}\right)\right)\right)\right)\right) \]
      13. exp-lowering-exp.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)\right)\right) \]
      14. +-commutativeN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(1 + wj\right)\right)\right)\right)\right) \]
      15. *-inversesN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(\frac{e^{wj}}{e^{wj}} + wj\right)\right)\right)\right)\right) \]
      16. distribute-neg-inN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\left(\mathsf{neg}\left(\frac{e^{wj}}{e^{wj}}\right)\right) + \color{blue}{\left(\mathsf{neg}\left(wj\right)\right)}\right)\right)\right) \]
    3. Simplified96.8%

      \[\leadsto \color{blue}{wj + \frac{wj - \frac{x}{e^{wj}}}{-1 - wj}} \]
    4. Add Preprocessing

    if -4.6e-6 < wj

    1. Initial program 78.3%

      \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
    2. Add Preprocessing
    3. Taylor expanded in wj around 0

      \[\leadsto \color{blue}{x + wj \cdot \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)} \]
    4. Step-by-step derivation
      1. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(x, \color{blue}{\left(wj \cdot \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)\right)}\right) \]
      2. *-lowering-*.f64N/A

        \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \color{blue}{\left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)}\right)\right) \]
      3. cancel-sign-sub-invN/A

        \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + \color{blue}{\left(\mathsf{neg}\left(2\right)\right) \cdot x}\right)\right)\right) \]
      4. metadata-evalN/A

        \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + -2 \cdot x\right)\right)\right) \]
      5. +-commutativeN/A

        \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(-2 \cdot x + \color{blue}{wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)}\right)\right)\right) \]
      6. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\left(-2 \cdot x\right), \color{blue}{\left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)\right)}\right)\right)\right) \]
    5. Simplified98.3%

      \[\leadsto \color{blue}{x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 - wj \cdot \left(\left(x \cdot 5 + x \cdot 0.6666666666666666\right) + \left(1 + x \cdot -3\right)\right)\right) + x \cdot 2.5\right)\right)} \]
  3. Recombined 2 regimes into one program.
  4. Final simplification98.3%

    \[\leadsto \begin{array}{l} \mathbf{if}\;wj \leq -4.6 \cdot 10^{-6}:\\ \;\;\;\;wj + \frac{wj - \frac{x}{e^{wj}}}{-1 - wj}\\ \mathbf{else}:\\ \;\;\;\;x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 + wj \cdot \left(\left(-1 - x \cdot -3\right) - \left(x \cdot 5 + x \cdot 0.6666666666666666\right)\right)\right) + x \cdot 2.5\right)\right)\\ \end{array} \]
  5. Add Preprocessing

Alternative 3: 97.6% accurate, 2.8× speedup?

\[\begin{array}{l} \\ \begin{array}{l} \mathbf{if}\;wj \leq -0.0023:\\ \;\;\;\;\frac{x}{e^{wj} \cdot \left(wj + 1\right)}\\ \mathbf{else}:\\ \;\;\;\;x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 + wj \cdot \left(\left(-1 - x \cdot -3\right) - \left(x \cdot 5 + x \cdot 0.6666666666666666\right)\right)\right) + x \cdot 2.5\right)\right)\\ \end{array} \end{array} \]
(FPCore (wj x)
 :precision binary64
 (if (<= wj -0.0023)
   (/ x (* (exp wj) (+ wj 1.0)))
   (+
    x
    (*
     wj
     (+
      (* x -2.0)
      (*
       wj
       (+
        (+
         1.0
         (* wj (- (- -1.0 (* x -3.0)) (+ (* x 5.0) (* x 0.6666666666666666)))))
        (* x 2.5))))))))
double code(double wj, double x) {
	double tmp;
	if (wj <= -0.0023) {
		tmp = x / (exp(wj) * (wj + 1.0));
	} else {
		tmp = x + (wj * ((x * -2.0) + (wj * ((1.0 + (wj * ((-1.0 - (x * -3.0)) - ((x * 5.0) + (x * 0.6666666666666666))))) + (x * 2.5)))));
	}
	return tmp;
}
real(8) function code(wj, x)
    real(8), intent (in) :: wj
    real(8), intent (in) :: x
    real(8) :: tmp
    if (wj <= (-0.0023d0)) then
        tmp = x / (exp(wj) * (wj + 1.0d0))
    else
        tmp = x + (wj * ((x * (-2.0d0)) + (wj * ((1.0d0 + (wj * (((-1.0d0) - (x * (-3.0d0))) - ((x * 5.0d0) + (x * 0.6666666666666666d0))))) + (x * 2.5d0)))))
    end if
    code = tmp
end function
public static double code(double wj, double x) {
	double tmp;
	if (wj <= -0.0023) {
		tmp = x / (Math.exp(wj) * (wj + 1.0));
	} else {
		tmp = x + (wj * ((x * -2.0) + (wj * ((1.0 + (wj * ((-1.0 - (x * -3.0)) - ((x * 5.0) + (x * 0.6666666666666666))))) + (x * 2.5)))));
	}
	return tmp;
}
def code(wj, x):
	tmp = 0
	if wj <= -0.0023:
		tmp = x / (math.exp(wj) * (wj + 1.0))
	else:
		tmp = x + (wj * ((x * -2.0) + (wj * ((1.0 + (wj * ((-1.0 - (x * -3.0)) - ((x * 5.0) + (x * 0.6666666666666666))))) + (x * 2.5)))))
	return tmp
function code(wj, x)
	tmp = 0.0
	if (wj <= -0.0023)
		tmp = Float64(x / Float64(exp(wj) * Float64(wj + 1.0)));
	else
		tmp = Float64(x + Float64(wj * Float64(Float64(x * -2.0) + Float64(wj * Float64(Float64(1.0 + Float64(wj * Float64(Float64(-1.0 - Float64(x * -3.0)) - Float64(Float64(x * 5.0) + Float64(x * 0.6666666666666666))))) + Float64(x * 2.5))))));
	end
	return tmp
end
function tmp_2 = code(wj, x)
	tmp = 0.0;
	if (wj <= -0.0023)
		tmp = x / (exp(wj) * (wj + 1.0));
	else
		tmp = x + (wj * ((x * -2.0) + (wj * ((1.0 + (wj * ((-1.0 - (x * -3.0)) - ((x * 5.0) + (x * 0.6666666666666666))))) + (x * 2.5)))));
	end
	tmp_2 = tmp;
end
code[wj_, x_] := If[LessEqual[wj, -0.0023], N[(x / N[(N[Exp[wj], $MachinePrecision] * N[(wj + 1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(x + N[(wj * N[(N[(x * -2.0), $MachinePrecision] + N[(wj * N[(N[(1.0 + N[(wj * N[(N[(-1.0 - N[(x * -3.0), $MachinePrecision]), $MachinePrecision] - N[(N[(x * 5.0), $MachinePrecision] + N[(x * 0.6666666666666666), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[(x * 2.5), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}

\\
\begin{array}{l}
\mathbf{if}\;wj \leq -0.0023:\\
\;\;\;\;\frac{x}{e^{wj} \cdot \left(wj + 1\right)}\\

\mathbf{else}:\\
\;\;\;\;x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 + wj \cdot \left(\left(-1 - x \cdot -3\right) - \left(x \cdot 5 + x \cdot 0.6666666666666666\right)\right)\right) + x \cdot 2.5\right)\right)\\


\end{array}
\end{array}
Derivation
  1. Split input into 2 regimes
  2. if wj < -0.0023

    1. Initial program 65.3%

      \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
    2. Step-by-step derivation
      1. sub-negN/A

        \[\leadsto wj + \color{blue}{\left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\right)\right)} \]
      2. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \color{blue}{\left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\right)\right)}\right) \]
      3. distribute-rgt1-inN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{\left(wj + 1\right) \cdot e^{wj}}\right)\right)\right) \]
      4. associate-/l/N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \left(\mathsf{neg}\left(\frac{\frac{wj \cdot e^{wj} - x}{e^{wj}}}{wj + 1}\right)\right)\right) \]
      5. distribute-neg-frac2N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \left(\frac{\frac{wj \cdot e^{wj} - x}{e^{wj}}}{\color{blue}{\mathsf{neg}\left(\left(wj + 1\right)\right)}}\right)\right) \]
      6. /-lowering-/.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(\frac{wj \cdot e^{wj} - x}{e^{wj}}\right), \color{blue}{\left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)}\right)\right) \]
      7. div-subN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(\frac{wj \cdot e^{wj}}{e^{wj}} - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\color{blue}{\left(wj + 1\right)}\right)\right)\right)\right) \]
      8. associate-/l*N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj \cdot \frac{e^{wj}}{e^{wj}} - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(\color{blue}{wj} + 1\right)\right)\right)\right)\right) \]
      9. *-inversesN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj \cdot 1 - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)\right)\right) \]
      10. *-rgt-identityN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(\color{blue}{wj} + 1\right)\right)\right)\right)\right) \]
      11. --lowering--.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \left(\frac{x}{e^{wj}}\right)\right), \left(\mathsf{neg}\left(\color{blue}{\left(wj + 1\right)}\right)\right)\right)\right) \]
      12. /-lowering-/.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \left(e^{wj}\right)\right)\right), \left(\mathsf{neg}\left(\left(wj + \color{blue}{1}\right)\right)\right)\right)\right) \]
      13. exp-lowering-exp.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)\right)\right) \]
      14. +-commutativeN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(1 + wj\right)\right)\right)\right)\right) \]
      15. *-inversesN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(\frac{e^{wj}}{e^{wj}} + wj\right)\right)\right)\right)\right) \]
      16. distribute-neg-inN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\left(\mathsf{neg}\left(\frac{e^{wj}}{e^{wj}}\right)\right) + \color{blue}{\left(\mathsf{neg}\left(wj\right)\right)}\right)\right)\right) \]
    3. Simplified99.6%

      \[\leadsto \color{blue}{wj + \frac{wj - \frac{x}{e^{wj}}}{-1 - wj}} \]
    4. Add Preprocessing
    5. Taylor expanded in x around inf

      \[\leadsto \color{blue}{\frac{x}{e^{wj} \cdot \left(1 + wj\right)}} \]
    6. Step-by-step derivation
      1. distribute-rgt-inN/A

        \[\leadsto \frac{x}{1 \cdot e^{wj} + \color{blue}{wj \cdot e^{wj}}} \]
      2. *-lft-identityN/A

        \[\leadsto \frac{x}{e^{wj} + \color{blue}{wj} \cdot e^{wj}} \]
      3. /-lowering-/.f64N/A

        \[\leadsto \mathsf{/.f64}\left(x, \color{blue}{\left(e^{wj} + wj \cdot e^{wj}\right)}\right) \]
      4. *-lft-identityN/A

        \[\leadsto \mathsf{/.f64}\left(x, \left(1 \cdot e^{wj} + \color{blue}{wj} \cdot e^{wj}\right)\right) \]
      5. distribute-rgt-inN/A

        \[\leadsto \mathsf{/.f64}\left(x, \left(e^{wj} \cdot \color{blue}{\left(1 + wj\right)}\right)\right) \]
      6. *-lowering-*.f64N/A

        \[\leadsto \mathsf{/.f64}\left(x, \mathsf{*.f64}\left(\left(e^{wj}\right), \color{blue}{\left(1 + wj\right)}\right)\right) \]
      7. exp-lowering-exp.f64N/A

        \[\leadsto \mathsf{/.f64}\left(x, \mathsf{*.f64}\left(\mathsf{exp.f64}\left(wj\right), \left(\color{blue}{1} + wj\right)\right)\right) \]
      8. +-commutativeN/A

        \[\leadsto \mathsf{/.f64}\left(x, \mathsf{*.f64}\left(\mathsf{exp.f64}\left(wj\right), \left(wj + \color{blue}{1}\right)\right)\right) \]
      9. +-lowering-+.f6483.4%

        \[\leadsto \mathsf{/.f64}\left(x, \mathsf{*.f64}\left(\mathsf{exp.f64}\left(wj\right), \mathsf{+.f64}\left(wj, \color{blue}{1}\right)\right)\right) \]
    7. Simplified83.4%

      \[\leadsto \color{blue}{\frac{x}{e^{wj} \cdot \left(wj + 1\right)}} \]

    if -0.0023 < wj

    1. Initial program 78.3%

      \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
    2. Add Preprocessing
    3. Taylor expanded in wj around 0

      \[\leadsto \color{blue}{x + wj \cdot \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)} \]
    4. Step-by-step derivation
      1. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(x, \color{blue}{\left(wj \cdot \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)\right)}\right) \]
      2. *-lowering-*.f64N/A

        \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \color{blue}{\left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)}\right)\right) \]
      3. cancel-sign-sub-invN/A

        \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + \color{blue}{\left(\mathsf{neg}\left(2\right)\right) \cdot x}\right)\right)\right) \]
      4. metadata-evalN/A

        \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + -2 \cdot x\right)\right)\right) \]
      5. +-commutativeN/A

        \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(-2 \cdot x + \color{blue}{wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)}\right)\right)\right) \]
      6. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\left(-2 \cdot x\right), \color{blue}{\left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)\right)}\right)\right)\right) \]
    5. Simplified98.2%

      \[\leadsto \color{blue}{x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 - wj \cdot \left(\left(x \cdot 5 + x \cdot 0.6666666666666666\right) + \left(1 + x \cdot -3\right)\right)\right) + x \cdot 2.5\right)\right)} \]
  3. Recombined 2 regimes into one program.
  4. Final simplification97.9%

    \[\leadsto \begin{array}{l} \mathbf{if}\;wj \leq -0.0023:\\ \;\;\;\;\frac{x}{e^{wj} \cdot \left(wj + 1\right)}\\ \mathbf{else}:\\ \;\;\;\;x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 + wj \cdot \left(\left(-1 - x \cdot -3\right) - \left(x \cdot 5 + x \cdot 0.6666666666666666\right)\right)\right) + x \cdot 2.5\right)\right)\\ \end{array} \]
  5. Add Preprocessing

Alternative 4: 96.2% accurate, 10.1× speedup?

\[\begin{array}{l} \\ x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 + wj \cdot \left(\left(-1 - x \cdot -3\right) - \left(x \cdot 5 + x \cdot 0.6666666666666666\right)\right)\right) + x \cdot 2.5\right)\right) \end{array} \]
(FPCore (wj x)
 :precision binary64
 (+
  x
  (*
   wj
   (+
    (* x -2.0)
    (*
     wj
     (+
      (+
       1.0
       (* wj (- (- -1.0 (* x -3.0)) (+ (* x 5.0) (* x 0.6666666666666666)))))
      (* x 2.5)))))))
double code(double wj, double x) {
	return x + (wj * ((x * -2.0) + (wj * ((1.0 + (wj * ((-1.0 - (x * -3.0)) - ((x * 5.0) + (x * 0.6666666666666666))))) + (x * 2.5)))));
}
real(8) function code(wj, x)
    real(8), intent (in) :: wj
    real(8), intent (in) :: x
    code = x + (wj * ((x * (-2.0d0)) + (wj * ((1.0d0 + (wj * (((-1.0d0) - (x * (-3.0d0))) - ((x * 5.0d0) + (x * 0.6666666666666666d0))))) + (x * 2.5d0)))))
end function
public static double code(double wj, double x) {
	return x + (wj * ((x * -2.0) + (wj * ((1.0 + (wj * ((-1.0 - (x * -3.0)) - ((x * 5.0) + (x * 0.6666666666666666))))) + (x * 2.5)))));
}
def code(wj, x):
	return x + (wj * ((x * -2.0) + (wj * ((1.0 + (wj * ((-1.0 - (x * -3.0)) - ((x * 5.0) + (x * 0.6666666666666666))))) + (x * 2.5)))))
function code(wj, x)
	return Float64(x + Float64(wj * Float64(Float64(x * -2.0) + Float64(wj * Float64(Float64(1.0 + Float64(wj * Float64(Float64(-1.0 - Float64(x * -3.0)) - Float64(Float64(x * 5.0) + Float64(x * 0.6666666666666666))))) + Float64(x * 2.5))))))
end
function tmp = code(wj, x)
	tmp = x + (wj * ((x * -2.0) + (wj * ((1.0 + (wj * ((-1.0 - (x * -3.0)) - ((x * 5.0) + (x * 0.6666666666666666))))) + (x * 2.5)))));
end
code[wj_, x_] := N[(x + N[(wj * N[(N[(x * -2.0), $MachinePrecision] + N[(wj * N[(N[(1.0 + N[(wj * N[(N[(-1.0 - N[(x * -3.0), $MachinePrecision]), $MachinePrecision] - N[(N[(x * 5.0), $MachinePrecision] + N[(x * 0.6666666666666666), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[(x * 2.5), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}

\\
x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 + wj \cdot \left(\left(-1 - x \cdot -3\right) - \left(x \cdot 5 + x \cdot 0.6666666666666666\right)\right)\right) + x \cdot 2.5\right)\right)
\end{array}
Derivation
  1. Initial program 78.0%

    \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
  2. Add Preprocessing
  3. Taylor expanded in wj around 0

    \[\leadsto \color{blue}{x + wj \cdot \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)} \]
  4. Step-by-step derivation
    1. +-lowering-+.f64N/A

      \[\leadsto \mathsf{+.f64}\left(x, \color{blue}{\left(wj \cdot \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)\right)}\right) \]
    2. *-lowering-*.f64N/A

      \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \color{blue}{\left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)}\right)\right) \]
    3. cancel-sign-sub-invN/A

      \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + \color{blue}{\left(\mathsf{neg}\left(2\right)\right) \cdot x}\right)\right)\right) \]
    4. metadata-evalN/A

      \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + -2 \cdot x\right)\right)\right) \]
    5. +-commutativeN/A

      \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(-2 \cdot x + \color{blue}{wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)}\right)\right)\right) \]
    6. +-lowering-+.f64N/A

      \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\left(-2 \cdot x\right), \color{blue}{\left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)\right)}\right)\right)\right) \]
  5. Simplified96.3%

    \[\leadsto \color{blue}{x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 - wj \cdot \left(\left(x \cdot 5 + x \cdot 0.6666666666666666\right) + \left(1 + x \cdot -3\right)\right)\right) + x \cdot 2.5\right)\right)} \]
  6. Final simplification96.3%

    \[\leadsto x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 + wj \cdot \left(\left(-1 - x \cdot -3\right) - \left(x \cdot 5 + x \cdot 0.6666666666666666\right)\right)\right) + x \cdot 2.5\right)\right) \]
  7. Add Preprocessing

Alternative 5: 83.8% accurate, 20.8× speedup?

\[\begin{array}{l} \\ \begin{array}{l} t_0 := x \cdot \left(1 - wj\right)\\ \mathbf{if}\;x \leq -4.4 \cdot 10^{-290}:\\ \;\;\;\;t\_0\\ \mathbf{elif}\;x \leq 1.08 \cdot 10^{-265}:\\ \;\;\;\;wj \cdot wj\\ \mathbf{else}:\\ \;\;\;\;t\_0\\ \end{array} \end{array} \]
(FPCore (wj x)
 :precision binary64
 (let* ((t_0 (* x (- 1.0 wj))))
   (if (<= x -4.4e-290) t_0 (if (<= x 1.08e-265) (* wj wj) t_0))))
double code(double wj, double x) {
	double t_0 = x * (1.0 - wj);
	double tmp;
	if (x <= -4.4e-290) {
		tmp = t_0;
	} else if (x <= 1.08e-265) {
		tmp = wj * wj;
	} else {
		tmp = t_0;
	}
	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 = x * (1.0d0 - wj)
    if (x <= (-4.4d-290)) then
        tmp = t_0
    else if (x <= 1.08d-265) then
        tmp = wj * wj
    else
        tmp = t_0
    end if
    code = tmp
end function
public static double code(double wj, double x) {
	double t_0 = x * (1.0 - wj);
	double tmp;
	if (x <= -4.4e-290) {
		tmp = t_0;
	} else if (x <= 1.08e-265) {
		tmp = wj * wj;
	} else {
		tmp = t_0;
	}
	return tmp;
}
def code(wj, x):
	t_0 = x * (1.0 - wj)
	tmp = 0
	if x <= -4.4e-290:
		tmp = t_0
	elif x <= 1.08e-265:
		tmp = wj * wj
	else:
		tmp = t_0
	return tmp
function code(wj, x)
	t_0 = Float64(x * Float64(1.0 - wj))
	tmp = 0.0
	if (x <= -4.4e-290)
		tmp = t_0;
	elseif (x <= 1.08e-265)
		tmp = Float64(wj * wj);
	else
		tmp = t_0;
	end
	return tmp
end
function tmp_2 = code(wj, x)
	t_0 = x * (1.0 - wj);
	tmp = 0.0;
	if (x <= -4.4e-290)
		tmp = t_0;
	elseif (x <= 1.08e-265)
		tmp = wj * wj;
	else
		tmp = t_0;
	end
	tmp_2 = tmp;
end
code[wj_, x_] := Block[{t$95$0 = N[(x * N[(1.0 - wj), $MachinePrecision]), $MachinePrecision]}, If[LessEqual[x, -4.4e-290], t$95$0, If[LessEqual[x, 1.08e-265], N[(wj * wj), $MachinePrecision], t$95$0]]]
\begin{array}{l}

\\
\begin{array}{l}
t_0 := x \cdot \left(1 - wj\right)\\
\mathbf{if}\;x \leq -4.4 \cdot 10^{-290}:\\
\;\;\;\;t\_0\\

\mathbf{elif}\;x \leq 1.08 \cdot 10^{-265}:\\
\;\;\;\;wj \cdot wj\\

\mathbf{else}:\\
\;\;\;\;t\_0\\


\end{array}
\end{array}
Derivation
  1. Split input into 2 regimes
  2. if x < -4.4000000000000002e-290 or 1.07999999999999998e-265 < x

    1. Initial program 82.6%

      \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
    2. Step-by-step derivation
      1. sub-negN/A

        \[\leadsto wj + \color{blue}{\left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\right)\right)} \]
      2. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \color{blue}{\left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\right)\right)}\right) \]
      3. distribute-rgt1-inN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{\left(wj + 1\right) \cdot e^{wj}}\right)\right)\right) \]
      4. associate-/l/N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \left(\mathsf{neg}\left(\frac{\frac{wj \cdot e^{wj} - x}{e^{wj}}}{wj + 1}\right)\right)\right) \]
      5. distribute-neg-frac2N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \left(\frac{\frac{wj \cdot e^{wj} - x}{e^{wj}}}{\color{blue}{\mathsf{neg}\left(\left(wj + 1\right)\right)}}\right)\right) \]
      6. /-lowering-/.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(\frac{wj \cdot e^{wj} - x}{e^{wj}}\right), \color{blue}{\left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)}\right)\right) \]
      7. div-subN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(\frac{wj \cdot e^{wj}}{e^{wj}} - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\color{blue}{\left(wj + 1\right)}\right)\right)\right)\right) \]
      8. associate-/l*N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj \cdot \frac{e^{wj}}{e^{wj}} - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(\color{blue}{wj} + 1\right)\right)\right)\right)\right) \]
      9. *-inversesN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj \cdot 1 - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)\right)\right) \]
      10. *-rgt-identityN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(\color{blue}{wj} + 1\right)\right)\right)\right)\right) \]
      11. --lowering--.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \left(\frac{x}{e^{wj}}\right)\right), \left(\mathsf{neg}\left(\color{blue}{\left(wj + 1\right)}\right)\right)\right)\right) \]
      12. /-lowering-/.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \left(e^{wj}\right)\right)\right), \left(\mathsf{neg}\left(\left(wj + \color{blue}{1}\right)\right)\right)\right)\right) \]
      13. exp-lowering-exp.f64N/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)\right)\right) \]
      14. +-commutativeN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(1 + wj\right)\right)\right)\right)\right) \]
      15. *-inversesN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(\frac{e^{wj}}{e^{wj}} + wj\right)\right)\right)\right)\right) \]
      16. distribute-neg-inN/A

        \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\left(\mathsf{neg}\left(\frac{e^{wj}}{e^{wj}}\right)\right) + \color{blue}{\left(\mathsf{neg}\left(wj\right)\right)}\right)\right)\right) \]
    3. Simplified84.7%

      \[\leadsto \color{blue}{wj + \frac{wj - \frac{x}{e^{wj}}}{-1 - wj}} \]
    4. Add Preprocessing
    5. Taylor expanded in wj around 0

      \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \color{blue}{x}\right), \mathsf{\_.f64}\left(-1, wj\right)\right)\right) \]
    6. Step-by-step derivation
      1. Simplified80.2%

        \[\leadsto wj + \frac{wj - \color{blue}{x}}{-1 - wj} \]
      2. Taylor expanded in x around inf

        \[\leadsto \color{blue}{x \cdot \left(-1 \cdot \frac{wj}{x \cdot \left(1 + wj\right)} + \left(\frac{1}{1 + wj} + \frac{wj}{x}\right)\right)} \]
      3. Step-by-step derivation
        1. *-lowering-*.f64N/A

          \[\leadsto \mathsf{*.f64}\left(x, \color{blue}{\left(-1 \cdot \frac{wj}{x \cdot \left(1 + wj\right)} + \left(\frac{1}{1 + wj} + \frac{wj}{x}\right)\right)}\right) \]
        2. +-commutativeN/A

          \[\leadsto \mathsf{*.f64}\left(x, \left(\left(\frac{1}{1 + wj} + \frac{wj}{x}\right) + \color{blue}{-1 \cdot \frac{wj}{x \cdot \left(1 + wj\right)}}\right)\right) \]
        3. +-commutativeN/A

          \[\leadsto \mathsf{*.f64}\left(x, \left(\left(\frac{wj}{x} + \frac{1}{1 + wj}\right) + \color{blue}{-1} \cdot \frac{wj}{x \cdot \left(1 + wj\right)}\right)\right) \]
        4. associate-+l+N/A

          \[\leadsto \mathsf{*.f64}\left(x, \left(\frac{wj}{x} + \color{blue}{\left(\frac{1}{1 + wj} + -1 \cdot \frac{wj}{x \cdot \left(1 + wj\right)}\right)}\right)\right) \]
        5. +-commutativeN/A

          \[\leadsto \mathsf{*.f64}\left(x, \left(\frac{wj}{x} + \left(-1 \cdot \frac{wj}{x \cdot \left(1 + wj\right)} + \color{blue}{\frac{1}{1 + wj}}\right)\right)\right) \]
        6. +-lowering-+.f64N/A

          \[\leadsto \mathsf{*.f64}\left(x, \mathsf{+.f64}\left(\left(\frac{wj}{x}\right), \color{blue}{\left(-1 \cdot \frac{wj}{x \cdot \left(1 + wj\right)} + \frac{1}{1 + wj}\right)}\right)\right) \]
        7. /-lowering-/.f64N/A

          \[\leadsto \mathsf{*.f64}\left(x, \mathsf{+.f64}\left(\mathsf{/.f64}\left(wj, x\right), \left(\color{blue}{-1 \cdot \frac{wj}{x \cdot \left(1 + wj\right)}} + \frac{1}{1 + wj}\right)\right)\right) \]
        8. +-commutativeN/A

          \[\leadsto \mathsf{*.f64}\left(x, \mathsf{+.f64}\left(\mathsf{/.f64}\left(wj, x\right), \left(\frac{1}{1 + wj} + \color{blue}{-1 \cdot \frac{wj}{x \cdot \left(1 + wj\right)}}\right)\right)\right) \]
        9. mul-1-negN/A

          \[\leadsto \mathsf{*.f64}\left(x, \mathsf{+.f64}\left(\mathsf{/.f64}\left(wj, x\right), \left(\frac{1}{1 + wj} + \left(\mathsf{neg}\left(\frac{wj}{x \cdot \left(1 + wj\right)}\right)\right)\right)\right)\right) \]
        10. unsub-negN/A

          \[\leadsto \mathsf{*.f64}\left(x, \mathsf{+.f64}\left(\mathsf{/.f64}\left(wj, x\right), \left(\frac{1}{1 + wj} - \color{blue}{\frac{wj}{x \cdot \left(1 + wj\right)}}\right)\right)\right) \]
        11. --lowering--.f64N/A

          \[\leadsto \mathsf{*.f64}\left(x, \mathsf{+.f64}\left(\mathsf{/.f64}\left(wj, x\right), \mathsf{\_.f64}\left(\left(\frac{1}{1 + wj}\right), \color{blue}{\left(\frac{wj}{x \cdot \left(1 + wj\right)}\right)}\right)\right)\right) \]
        12. /-lowering-/.f64N/A

          \[\leadsto \mathsf{*.f64}\left(x, \mathsf{+.f64}\left(\mathsf{/.f64}\left(wj, x\right), \mathsf{\_.f64}\left(\mathsf{/.f64}\left(1, \left(1 + wj\right)\right), \left(\frac{\color{blue}{wj}}{x \cdot \left(1 + wj\right)}\right)\right)\right)\right) \]
        13. +-commutativeN/A

          \[\leadsto \mathsf{*.f64}\left(x, \mathsf{+.f64}\left(\mathsf{/.f64}\left(wj, x\right), \mathsf{\_.f64}\left(\mathsf{/.f64}\left(1, \left(wj + 1\right)\right), \left(\frac{wj}{x \cdot \left(1 + wj\right)}\right)\right)\right)\right) \]
        14. +-lowering-+.f64N/A

          \[\leadsto \mathsf{*.f64}\left(x, \mathsf{+.f64}\left(\mathsf{/.f64}\left(wj, x\right), \mathsf{\_.f64}\left(\mathsf{/.f64}\left(1, \mathsf{+.f64}\left(wj, 1\right)\right), \left(\frac{wj}{x \cdot \left(1 + wj\right)}\right)\right)\right)\right) \]
        15. /-lowering-/.f64N/A

          \[\leadsto \mathsf{*.f64}\left(x, \mathsf{+.f64}\left(\mathsf{/.f64}\left(wj, x\right), \mathsf{\_.f64}\left(\mathsf{/.f64}\left(1, \mathsf{+.f64}\left(wj, 1\right)\right), \mathsf{/.f64}\left(wj, \color{blue}{\left(x \cdot \left(1 + wj\right)\right)}\right)\right)\right)\right) \]
        16. *-lowering-*.f64N/A

          \[\leadsto \mathsf{*.f64}\left(x, \mathsf{+.f64}\left(\mathsf{/.f64}\left(wj, x\right), \mathsf{\_.f64}\left(\mathsf{/.f64}\left(1, \mathsf{+.f64}\left(wj, 1\right)\right), \mathsf{/.f64}\left(wj, \mathsf{*.f64}\left(x, \color{blue}{\left(1 + wj\right)}\right)\right)\right)\right)\right) \]
        17. +-commutativeN/A

          \[\leadsto \mathsf{*.f64}\left(x, \mathsf{+.f64}\left(\mathsf{/.f64}\left(wj, x\right), \mathsf{\_.f64}\left(\mathsf{/.f64}\left(1, \mathsf{+.f64}\left(wj, 1\right)\right), \mathsf{/.f64}\left(wj, \mathsf{*.f64}\left(x, \left(wj + \color{blue}{1}\right)\right)\right)\right)\right)\right) \]
        18. +-lowering-+.f6480.9%

          \[\leadsto \mathsf{*.f64}\left(x, \mathsf{+.f64}\left(\mathsf{/.f64}\left(wj, x\right), \mathsf{\_.f64}\left(\mathsf{/.f64}\left(1, \mathsf{+.f64}\left(wj, 1\right)\right), \mathsf{/.f64}\left(wj, \mathsf{*.f64}\left(x, \mathsf{+.f64}\left(wj, \color{blue}{1}\right)\right)\right)\right)\right)\right) \]
      4. Simplified80.9%

        \[\leadsto \color{blue}{x \cdot \left(\frac{wj}{x} + \left(\frac{1}{wj + 1} - \frac{wj}{x \cdot \left(wj + 1\right)}\right)\right)} \]
      5. Taylor expanded in wj around 0

        \[\leadsto \color{blue}{x + -1 \cdot \left(wj \cdot x\right)} \]
      6. Step-by-step derivation
        1. associate-*r*N/A

          \[\leadsto x + \left(-1 \cdot wj\right) \cdot \color{blue}{x} \]
        2. distribute-rgt1-inN/A

          \[\leadsto \left(-1 \cdot wj + 1\right) \cdot \color{blue}{x} \]
        3. +-commutativeN/A

          \[\leadsto \left(1 + -1 \cdot wj\right) \cdot x \]
        4. mul-1-negN/A

          \[\leadsto \left(1 + \left(\mathsf{neg}\left(wj\right)\right)\right) \cdot x \]
        5. sub-negN/A

          \[\leadsto \left(1 - wj\right) \cdot x \]
        6. *-lowering-*.f64N/A

          \[\leadsto \mathsf{*.f64}\left(\left(1 - wj\right), \color{blue}{x}\right) \]
        7. --lowering--.f6487.5%

          \[\leadsto \mathsf{*.f64}\left(\mathsf{\_.f64}\left(1, wj\right), x\right) \]
      7. Simplified87.5%

        \[\leadsto \color{blue}{\left(1 - wj\right) \cdot x} \]

      if -4.4000000000000002e-290 < x < 1.07999999999999998e-265

      1. Initial program 18.2%

        \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
      2. Add Preprocessing
      3. Taylor expanded in wj around 0

        \[\leadsto \color{blue}{x + wj \cdot \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)} \]
      4. Step-by-step derivation
        1. +-lowering-+.f64N/A

          \[\leadsto \mathsf{+.f64}\left(x, \color{blue}{\left(wj \cdot \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)\right)}\right) \]
        2. *-lowering-*.f64N/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \color{blue}{\left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)}\right)\right) \]
        3. cancel-sign-sub-invN/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + \color{blue}{\left(\mathsf{neg}\left(2\right)\right) \cdot x}\right)\right)\right) \]
        4. metadata-evalN/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + -2 \cdot x\right)\right)\right) \]
        5. +-commutativeN/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(-2 \cdot x + \color{blue}{wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)}\right)\right)\right) \]
        6. +-lowering-+.f64N/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\left(-2 \cdot x\right), \color{blue}{\left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)\right)}\right)\right)\right) \]
      5. Simplified98.4%

        \[\leadsto \color{blue}{x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 - wj \cdot \left(\left(x \cdot 5 + x \cdot 0.6666666666666666\right) + \left(1 + x \cdot -3\right)\right)\right) + x \cdot 2.5\right)\right)} \]
      6. Taylor expanded in x around 0

        \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \color{blue}{\left(wj \cdot \left(1 - wj\right)\right)}\right)\right)\right) \]
      7. Step-by-step derivation
        1. *-lowering-*.f64N/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \mathsf{*.f64}\left(wj, \color{blue}{\left(1 - wj\right)}\right)\right)\right)\right) \]
        2. --lowering--.f6498.4%

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \mathsf{*.f64}\left(wj, \mathsf{\_.f64}\left(1, \color{blue}{wj}\right)\right)\right)\right)\right) \]
      8. Simplified98.4%

        \[\leadsto x + wj \cdot \left(x \cdot -2 + \color{blue}{wj \cdot \left(1 - wj\right)}\right) \]
      9. Taylor expanded in wj around 0

        \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \color{blue}{wj}\right)\right)\right) \]
      10. Step-by-step derivation
        1. Simplified95.2%

          \[\leadsto x + wj \cdot \left(x \cdot -2 + \color{blue}{wj}\right) \]
        2. Taylor expanded in x around 0

          \[\leadsto \color{blue}{{wj}^{2}} \]
        3. Step-by-step derivation
          1. unpow2N/A

            \[\leadsto wj \cdot \color{blue}{wj} \]
          2. *-lowering-*.f6475.3%

            \[\leadsto \mathsf{*.f64}\left(wj, \color{blue}{wj}\right) \]
        4. Simplified75.3%

          \[\leadsto \color{blue}{wj \cdot wj} \]
      11. Recombined 2 regimes into one program.
      12. Final simplification86.6%

        \[\leadsto \begin{array}{l} \mathbf{if}\;x \leq -4.4 \cdot 10^{-290}:\\ \;\;\;\;x \cdot \left(1 - wj\right)\\ \mathbf{elif}\;x \leq 1.08 \cdot 10^{-265}:\\ \;\;\;\;wj \cdot wj\\ \mathbf{else}:\\ \;\;\;\;x \cdot \left(1 - wj\right)\\ \end{array} \]
      13. Add Preprocessing

      Alternative 6: 95.8% accurate, 20.9× speedup?

      \[\begin{array}{l} \\ x + wj \cdot \left(x \cdot -2 + wj \cdot \left(1 + x \cdot 2.5\right)\right) \end{array} \]
      (FPCore (wj x)
       :precision binary64
       (+ x (* wj (+ (* x -2.0) (* wj (+ 1.0 (* x 2.5)))))))
      double code(double wj, double x) {
      	return x + (wj * ((x * -2.0) + (wj * (1.0 + (x * 2.5)))));
      }
      
      real(8) function code(wj, x)
          real(8), intent (in) :: wj
          real(8), intent (in) :: x
          code = x + (wj * ((x * (-2.0d0)) + (wj * (1.0d0 + (x * 2.5d0)))))
      end function
      
      public static double code(double wj, double x) {
      	return x + (wj * ((x * -2.0) + (wj * (1.0 + (x * 2.5)))));
      }
      
      def code(wj, x):
      	return x + (wj * ((x * -2.0) + (wj * (1.0 + (x * 2.5)))))
      
      function code(wj, x)
      	return Float64(x + Float64(wj * Float64(Float64(x * -2.0) + Float64(wj * Float64(1.0 + Float64(x * 2.5))))))
      end
      
      function tmp = code(wj, x)
      	tmp = x + (wj * ((x * -2.0) + (wj * (1.0 + (x * 2.5)))));
      end
      
      code[wj_, x_] := 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]
      
      \begin{array}{l}
      
      \\
      x + wj \cdot \left(x \cdot -2 + wj \cdot \left(1 + x \cdot 2.5\right)\right)
      \end{array}
      
      Derivation
      1. Initial program 78.0%

        \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
      2. Add Preprocessing
      3. Taylor expanded in wj around 0

        \[\leadsto \color{blue}{x + wj \cdot \left(wj \cdot \left(1 - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)} \]
      4. Step-by-step derivation
        1. +-lowering-+.f64N/A

          \[\leadsto \mathsf{+.f64}\left(x, \color{blue}{\left(wj \cdot \left(wj \cdot \left(1 - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)\right)}\right) \]
        2. *-lowering-*.f64N/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \color{blue}{\left(wj \cdot \left(1 - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)}\right)\right) \]
        3. cancel-sign-sub-invN/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(1 - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + \color{blue}{\left(\mathsf{neg}\left(2\right)\right) \cdot x}\right)\right)\right) \]
        4. metadata-evalN/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(1 - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + -2 \cdot x\right)\right)\right) \]
        5. +-commutativeN/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(-2 \cdot x + \color{blue}{wj \cdot \left(1 - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)}\right)\right)\right) \]
        6. +-lowering-+.f64N/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\left(-2 \cdot x\right), \color{blue}{\left(wj \cdot \left(1 - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)\right)}\right)\right)\right) \]
        7. *-commutativeN/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\left(x \cdot -2\right), \left(\color{blue}{wj} \cdot \left(1 - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)\right)\right)\right)\right) \]
        8. *-lowering-*.f64N/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \left(\color{blue}{wj} \cdot \left(1 - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)\right)\right)\right)\right) \]
        9. *-lowering-*.f64N/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \mathsf{*.f64}\left(wj, \color{blue}{\left(1 - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)}\right)\right)\right)\right) \]
        10. sub-negN/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \mathsf{*.f64}\left(wj, \left(1 + \color{blue}{\left(\mathsf{neg}\left(\left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)\right)}\right)\right)\right)\right)\right) \]
        11. +-lowering-+.f64N/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(1, \color{blue}{\left(\mathsf{neg}\left(\left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)\right)}\right)\right)\right)\right)\right) \]
        12. distribute-rgt-outN/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(1, \left(\mathsf{neg}\left(x \cdot \left(-4 + \frac{3}{2}\right)\right)\right)\right)\right)\right)\right)\right) \]
        13. distribute-rgt-neg-inN/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(1, \left(x \cdot \color{blue}{\left(\mathsf{neg}\left(\left(-4 + \frac{3}{2}\right)\right)\right)}\right)\right)\right)\right)\right)\right) \]
        14. *-lowering-*.f64N/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(x, \color{blue}{\left(\mathsf{neg}\left(\left(-4 + \frac{3}{2}\right)\right)\right)}\right)\right)\right)\right)\right)\right) \]
        15. metadata-evalN/A

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(x, \left(\mathsf{neg}\left(\frac{-5}{2}\right)\right)\right)\right)\right)\right)\right)\right) \]
        16. metadata-eval95.9%

          \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(x, \frac{5}{2}\right)\right)\right)\right)\right)\right) \]
      5. Simplified95.9%

        \[\leadsto \color{blue}{x + wj \cdot \left(x \cdot -2 + wj \cdot \left(1 + x \cdot 2.5\right)\right)} \]
      6. Add Preprocessing

      Alternative 7: 83.8% accurate, 24.0× speedup?

      \[\begin{array}{l} \\ \begin{array}{l} \mathbf{if}\;x \leq -7.8 \cdot 10^{-291}:\\ \;\;\;\;x\\ \mathbf{elif}\;x \leq 8.5 \cdot 10^{-264}:\\ \;\;\;\;wj \cdot wj\\ \mathbf{else}:\\ \;\;\;\;x\\ \end{array} \end{array} \]
      (FPCore (wj x)
       :precision binary64
       (if (<= x -7.8e-291) x (if (<= x 8.5e-264) (* wj wj) x)))
      double code(double wj, double x) {
      	double tmp;
      	if (x <= -7.8e-291) {
      		tmp = x;
      	} else if (x <= 8.5e-264) {
      		tmp = wj * wj;
      	} else {
      		tmp = x;
      	}
      	return tmp;
      }
      
      real(8) function code(wj, x)
          real(8), intent (in) :: wj
          real(8), intent (in) :: x
          real(8) :: tmp
          if (x <= (-7.8d-291)) then
              tmp = x
          else if (x <= 8.5d-264) then
              tmp = wj * wj
          else
              tmp = x
          end if
          code = tmp
      end function
      
      public static double code(double wj, double x) {
      	double tmp;
      	if (x <= -7.8e-291) {
      		tmp = x;
      	} else if (x <= 8.5e-264) {
      		tmp = wj * wj;
      	} else {
      		tmp = x;
      	}
      	return tmp;
      }
      
      def code(wj, x):
      	tmp = 0
      	if x <= -7.8e-291:
      		tmp = x
      	elif x <= 8.5e-264:
      		tmp = wj * wj
      	else:
      		tmp = x
      	return tmp
      
      function code(wj, x)
      	tmp = 0.0
      	if (x <= -7.8e-291)
      		tmp = x;
      	elseif (x <= 8.5e-264)
      		tmp = Float64(wj * wj);
      	else
      		tmp = x;
      	end
      	return tmp
      end
      
      function tmp_2 = code(wj, x)
      	tmp = 0.0;
      	if (x <= -7.8e-291)
      		tmp = x;
      	elseif (x <= 8.5e-264)
      		tmp = wj * wj;
      	else
      		tmp = x;
      	end
      	tmp_2 = tmp;
      end
      
      code[wj_, x_] := If[LessEqual[x, -7.8e-291], x, If[LessEqual[x, 8.5e-264], N[(wj * wj), $MachinePrecision], x]]
      
      \begin{array}{l}
      
      \\
      \begin{array}{l}
      \mathbf{if}\;x \leq -7.8 \cdot 10^{-291}:\\
      \;\;\;\;x\\
      
      \mathbf{elif}\;x \leq 8.5 \cdot 10^{-264}:\\
      \;\;\;\;wj \cdot wj\\
      
      \mathbf{else}:\\
      \;\;\;\;x\\
      
      
      \end{array}
      \end{array}
      
      Derivation
      1. Split input into 2 regimes
      2. if x < -7.80000000000000031e-291 or 8.5000000000000001e-264 < x

        1. Initial program 82.6%

          \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
        2. Step-by-step derivation
          1. sub-negN/A

            \[\leadsto wj + \color{blue}{\left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\right)\right)} \]
          2. +-lowering-+.f64N/A

            \[\leadsto \mathsf{+.f64}\left(wj, \color{blue}{\left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\right)\right)}\right) \]
          3. distribute-rgt1-inN/A

            \[\leadsto \mathsf{+.f64}\left(wj, \left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{\left(wj + 1\right) \cdot e^{wj}}\right)\right)\right) \]
          4. associate-/l/N/A

            \[\leadsto \mathsf{+.f64}\left(wj, \left(\mathsf{neg}\left(\frac{\frac{wj \cdot e^{wj} - x}{e^{wj}}}{wj + 1}\right)\right)\right) \]
          5. distribute-neg-frac2N/A

            \[\leadsto \mathsf{+.f64}\left(wj, \left(\frac{\frac{wj \cdot e^{wj} - x}{e^{wj}}}{\color{blue}{\mathsf{neg}\left(\left(wj + 1\right)\right)}}\right)\right) \]
          6. /-lowering-/.f64N/A

            \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(\frac{wj \cdot e^{wj} - x}{e^{wj}}\right), \color{blue}{\left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)}\right)\right) \]
          7. div-subN/A

            \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(\frac{wj \cdot e^{wj}}{e^{wj}} - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\color{blue}{\left(wj + 1\right)}\right)\right)\right)\right) \]
          8. associate-/l*N/A

            \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj \cdot \frac{e^{wj}}{e^{wj}} - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(\color{blue}{wj} + 1\right)\right)\right)\right)\right) \]
          9. *-inversesN/A

            \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj \cdot 1 - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)\right)\right) \]
          10. *-rgt-identityN/A

            \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(\color{blue}{wj} + 1\right)\right)\right)\right)\right) \]
          11. --lowering--.f64N/A

            \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \left(\frac{x}{e^{wj}}\right)\right), \left(\mathsf{neg}\left(\color{blue}{\left(wj + 1\right)}\right)\right)\right)\right) \]
          12. /-lowering-/.f64N/A

            \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \left(e^{wj}\right)\right)\right), \left(\mathsf{neg}\left(\left(wj + \color{blue}{1}\right)\right)\right)\right)\right) \]
          13. exp-lowering-exp.f64N/A

            \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)\right)\right) \]
          14. +-commutativeN/A

            \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(1 + wj\right)\right)\right)\right)\right) \]
          15. *-inversesN/A

            \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(\frac{e^{wj}}{e^{wj}} + wj\right)\right)\right)\right)\right) \]
          16. distribute-neg-inN/A

            \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\left(\mathsf{neg}\left(\frac{e^{wj}}{e^{wj}}\right)\right) + \color{blue}{\left(\mathsf{neg}\left(wj\right)\right)}\right)\right)\right) \]
        3. Simplified84.7%

          \[\leadsto \color{blue}{wj + \frac{wj - \frac{x}{e^{wj}}}{-1 - wj}} \]
        4. Add Preprocessing
        5. Taylor expanded in wj around 0

          \[\leadsto \color{blue}{x} \]
        6. Step-by-step derivation
          1. Simplified87.4%

            \[\leadsto \color{blue}{x} \]

          if -7.80000000000000031e-291 < x < 8.5000000000000001e-264

          1. Initial program 18.2%

            \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
          2. Add Preprocessing
          3. Taylor expanded in wj around 0

            \[\leadsto \color{blue}{x + wj \cdot \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)} \]
          4. Step-by-step derivation
            1. +-lowering-+.f64N/A

              \[\leadsto \mathsf{+.f64}\left(x, \color{blue}{\left(wj \cdot \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)\right)}\right) \]
            2. *-lowering-*.f64N/A

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \color{blue}{\left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)}\right)\right) \]
            3. cancel-sign-sub-invN/A

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + \color{blue}{\left(\mathsf{neg}\left(2\right)\right) \cdot x}\right)\right)\right) \]
            4. metadata-evalN/A

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + -2 \cdot x\right)\right)\right) \]
            5. +-commutativeN/A

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(-2 \cdot x + \color{blue}{wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)}\right)\right)\right) \]
            6. +-lowering-+.f64N/A

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\left(-2 \cdot x\right), \color{blue}{\left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)\right)}\right)\right)\right) \]
          5. Simplified98.4%

            \[\leadsto \color{blue}{x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 - wj \cdot \left(\left(x \cdot 5 + x \cdot 0.6666666666666666\right) + \left(1 + x \cdot -3\right)\right)\right) + x \cdot 2.5\right)\right)} \]
          6. Taylor expanded in x around 0

            \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \color{blue}{\left(wj \cdot \left(1 - wj\right)\right)}\right)\right)\right) \]
          7. Step-by-step derivation
            1. *-lowering-*.f64N/A

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \mathsf{*.f64}\left(wj, \color{blue}{\left(1 - wj\right)}\right)\right)\right)\right) \]
            2. --lowering--.f6498.4%

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \mathsf{*.f64}\left(wj, \mathsf{\_.f64}\left(1, \color{blue}{wj}\right)\right)\right)\right)\right) \]
          8. Simplified98.4%

            \[\leadsto x + wj \cdot \left(x \cdot -2 + \color{blue}{wj \cdot \left(1 - wj\right)}\right) \]
          9. Taylor expanded in wj around 0

            \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \color{blue}{wj}\right)\right)\right) \]
          10. Step-by-step derivation
            1. Simplified95.2%

              \[\leadsto x + wj \cdot \left(x \cdot -2 + \color{blue}{wj}\right) \]
            2. Taylor expanded in x around 0

              \[\leadsto \color{blue}{{wj}^{2}} \]
            3. Step-by-step derivation
              1. unpow2N/A

                \[\leadsto wj \cdot \color{blue}{wj} \]
              2. *-lowering-*.f6475.3%

                \[\leadsto \mathsf{*.f64}\left(wj, \color{blue}{wj}\right) \]
            4. Simplified75.3%

              \[\leadsto \color{blue}{wj \cdot wj} \]
          11. Recombined 2 regimes into one program.
          12. Add Preprocessing

          Alternative 8: 96.0% accurate, 24.1× speedup?

          \[\begin{array}{l} \\ x - wj \cdot \left(wj \cdot \left(wj + -1\right) - x \cdot -2\right) \end{array} \]
          (FPCore (wj x)
           :precision binary64
           (- x (* wj (- (* wj (+ wj -1.0)) (* x -2.0)))))
          double code(double wj, double x) {
          	return x - (wj * ((wj * (wj + -1.0)) - (x * -2.0)));
          }
          
          real(8) function code(wj, x)
              real(8), intent (in) :: wj
              real(8), intent (in) :: x
              code = x - (wj * ((wj * (wj + (-1.0d0))) - (x * (-2.0d0))))
          end function
          
          public static double code(double wj, double x) {
          	return x - (wj * ((wj * (wj + -1.0)) - (x * -2.0)));
          }
          
          def code(wj, x):
          	return x - (wj * ((wj * (wj + -1.0)) - (x * -2.0)))
          
          function code(wj, x)
          	return Float64(x - Float64(wj * Float64(Float64(wj * Float64(wj + -1.0)) - Float64(x * -2.0))))
          end
          
          function tmp = code(wj, x)
          	tmp = x - (wj * ((wj * (wj + -1.0)) - (x * -2.0)));
          end
          
          code[wj_, x_] := N[(x - N[(wj * N[(N[(wj * N[(wj + -1.0), $MachinePrecision]), $MachinePrecision] - N[(x * -2.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
          
          \begin{array}{l}
          
          \\
          x - wj \cdot \left(wj \cdot \left(wj + -1\right) - x \cdot -2\right)
          \end{array}
          
          Derivation
          1. Initial program 78.0%

            \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
          2. Add Preprocessing
          3. Taylor expanded in wj around 0

            \[\leadsto \color{blue}{x + wj \cdot \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)} \]
          4. Step-by-step derivation
            1. +-lowering-+.f64N/A

              \[\leadsto \mathsf{+.f64}\left(x, \color{blue}{\left(wj \cdot \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)\right)}\right) \]
            2. *-lowering-*.f64N/A

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \color{blue}{\left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)}\right)\right) \]
            3. cancel-sign-sub-invN/A

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + \color{blue}{\left(\mathsf{neg}\left(2\right)\right) \cdot x}\right)\right)\right) \]
            4. metadata-evalN/A

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + -2 \cdot x\right)\right)\right) \]
            5. +-commutativeN/A

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(-2 \cdot x + \color{blue}{wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)}\right)\right)\right) \]
            6. +-lowering-+.f64N/A

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\left(-2 \cdot x\right), \color{blue}{\left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)\right)}\right)\right)\right) \]
          5. Simplified96.3%

            \[\leadsto \color{blue}{x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 - wj \cdot \left(\left(x \cdot 5 + x \cdot 0.6666666666666666\right) + \left(1 + x \cdot -3\right)\right)\right) + x \cdot 2.5\right)\right)} \]
          6. Taylor expanded in x around 0

            \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \color{blue}{\left(wj \cdot \left(1 - wj\right)\right)}\right)\right)\right) \]
          7. Step-by-step derivation
            1. *-lowering-*.f64N/A

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \mathsf{*.f64}\left(wj, \color{blue}{\left(1 - wj\right)}\right)\right)\right)\right) \]
            2. --lowering--.f6495.8%

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \mathsf{*.f64}\left(wj, \mathsf{\_.f64}\left(1, \color{blue}{wj}\right)\right)\right)\right)\right) \]
          8. Simplified95.8%

            \[\leadsto x + wj \cdot \left(x \cdot -2 + \color{blue}{wj \cdot \left(1 - wj\right)}\right) \]
          9. Final simplification95.8%

            \[\leadsto x - wj \cdot \left(wj \cdot \left(wj + -1\right) - x \cdot -2\right) \]
          10. Add Preprocessing

          Alternative 9: 95.6% accurate, 34.8× speedup?

          \[\begin{array}{l} \\ x + wj \cdot \left(wj + x \cdot -2\right) \end{array} \]
          (FPCore (wj x) :precision binary64 (+ x (* wj (+ wj (* x -2.0)))))
          double code(double wj, double x) {
          	return x + (wj * (wj + (x * -2.0)));
          }
          
          real(8) function code(wj, x)
              real(8), intent (in) :: wj
              real(8), intent (in) :: x
              code = x + (wj * (wj + (x * (-2.0d0))))
          end function
          
          public static double code(double wj, double x) {
          	return x + (wj * (wj + (x * -2.0)));
          }
          
          def code(wj, x):
          	return x + (wj * (wj + (x * -2.0)))
          
          function code(wj, x)
          	return Float64(x + Float64(wj * Float64(wj + Float64(x * -2.0))))
          end
          
          function tmp = code(wj, x)
          	tmp = x + (wj * (wj + (x * -2.0)));
          end
          
          code[wj_, x_] := N[(x + N[(wj * N[(wj + N[(x * -2.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
          
          \begin{array}{l}
          
          \\
          x + wj \cdot \left(wj + x \cdot -2\right)
          \end{array}
          
          Derivation
          1. Initial program 78.0%

            \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
          2. Add Preprocessing
          3. Taylor expanded in wj around 0

            \[\leadsto \color{blue}{x + wj \cdot \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)} \]
          4. Step-by-step derivation
            1. +-lowering-+.f64N/A

              \[\leadsto \mathsf{+.f64}\left(x, \color{blue}{\left(wj \cdot \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)\right)}\right) \]
            2. *-lowering-*.f64N/A

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \color{blue}{\left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)}\right)\right) \]
            3. cancel-sign-sub-invN/A

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + \color{blue}{\left(\mathsf{neg}\left(2\right)\right) \cdot x}\right)\right)\right) \]
            4. metadata-evalN/A

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + -2 \cdot x\right)\right)\right) \]
            5. +-commutativeN/A

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(-2 \cdot x + \color{blue}{wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)}\right)\right)\right) \]
            6. +-lowering-+.f64N/A

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\left(-2 \cdot x\right), \color{blue}{\left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)\right)}\right)\right)\right) \]
          5. Simplified96.3%

            \[\leadsto \color{blue}{x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 - wj \cdot \left(\left(x \cdot 5 + x \cdot 0.6666666666666666\right) + \left(1 + x \cdot -3\right)\right)\right) + x \cdot 2.5\right)\right)} \]
          6. Taylor expanded in x around 0

            \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \color{blue}{\left(wj \cdot \left(1 - wj\right)\right)}\right)\right)\right) \]
          7. Step-by-step derivation
            1. *-lowering-*.f64N/A

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \mathsf{*.f64}\left(wj, \color{blue}{\left(1 - wj\right)}\right)\right)\right)\right) \]
            2. --lowering--.f6495.8%

              \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \mathsf{*.f64}\left(wj, \mathsf{\_.f64}\left(1, \color{blue}{wj}\right)\right)\right)\right)\right) \]
          8. Simplified95.8%

            \[\leadsto x + wj \cdot \left(x \cdot -2 + \color{blue}{wj \cdot \left(1 - wj\right)}\right) \]
          9. Taylor expanded in wj around 0

            \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\mathsf{*.f64}\left(x, -2\right), \color{blue}{wj}\right)\right)\right) \]
          10. Step-by-step derivation
            1. Simplified95.5%

              \[\leadsto x + wj \cdot \left(x \cdot -2 + \color{blue}{wj}\right) \]
            2. Final simplification95.5%

              \[\leadsto x + wj \cdot \left(wj + x \cdot -2\right) \]
            3. Add Preprocessing

            Alternative 10: 95.3% accurate, 62.6× speedup?

            \[\begin{array}{l} \\ x + wj \cdot wj \end{array} \]
            (FPCore (wj x) :precision binary64 (+ x (* wj wj)))
            double code(double wj, double x) {
            	return x + (wj * wj);
            }
            
            real(8) function code(wj, x)
                real(8), intent (in) :: wj
                real(8), intent (in) :: x
                code = x + (wj * wj)
            end function
            
            public static double code(double wj, double x) {
            	return x + (wj * wj);
            }
            
            def code(wj, x):
            	return x + (wj * wj)
            
            function code(wj, x)
            	return Float64(x + Float64(wj * wj))
            end
            
            function tmp = code(wj, x)
            	tmp = x + (wj * wj);
            end
            
            code[wj_, x_] := N[(x + N[(wj * wj), $MachinePrecision]), $MachinePrecision]
            
            \begin{array}{l}
            
            \\
            x + wj \cdot wj
            \end{array}
            
            Derivation
            1. Initial program 78.0%

              \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
            2. Add Preprocessing
            3. Taylor expanded in wj around 0

              \[\leadsto \color{blue}{x + wj \cdot \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)} \]
            4. Step-by-step derivation
              1. +-lowering-+.f64N/A

                \[\leadsto \mathsf{+.f64}\left(x, \color{blue}{\left(wj \cdot \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)\right)}\right) \]
              2. *-lowering-*.f64N/A

                \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \color{blue}{\left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) - 2 \cdot x\right)}\right)\right) \]
              3. cancel-sign-sub-invN/A

                \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + \color{blue}{\left(\mathsf{neg}\left(2\right)\right) \cdot x}\right)\right)\right) \]
              4. metadata-evalN/A

                \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right) + -2 \cdot x\right)\right)\right) \]
              5. +-commutativeN/A

                \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \left(-2 \cdot x + \color{blue}{wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)}\right)\right)\right) \]
              6. +-lowering-+.f64N/A

                \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(wj, \mathsf{+.f64}\left(\left(-2 \cdot x\right), \color{blue}{\left(wj \cdot \left(\left(1 + -1 \cdot \left(wj \cdot \left(1 + \left(-3 \cdot x + \left(-2 \cdot \left(-4 \cdot x + \frac{3}{2} \cdot x\right) + \frac{2}{3} \cdot x\right)\right)\right)\right)\right) - \left(-4 \cdot x + \frac{3}{2} \cdot x\right)\right)\right)}\right)\right)\right) \]
            5. Simplified96.3%

              \[\leadsto \color{blue}{x + wj \cdot \left(x \cdot -2 + wj \cdot \left(\left(1 - wj \cdot \left(\left(x \cdot 5 + x \cdot 0.6666666666666666\right) + \left(1 + x \cdot -3\right)\right)\right) + x \cdot 2.5\right)\right)} \]
            6. Taylor expanded in x around 0

              \[\leadsto \mathsf{+.f64}\left(x, \color{blue}{\left({wj}^{2} \cdot \left(1 - wj\right)\right)}\right) \]
            7. Step-by-step derivation
              1. *-lowering-*.f64N/A

                \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(\left({wj}^{2}\right), \color{blue}{\left(1 - wj\right)}\right)\right) \]
              2. unpow2N/A

                \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(\left(wj \cdot wj\right), \left(\color{blue}{1} - wj\right)\right)\right) \]
              3. *-lowering-*.f64N/A

                \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(\mathsf{*.f64}\left(wj, wj\right), \left(\color{blue}{1} - wj\right)\right)\right) \]
              4. --lowering--.f6494.7%

                \[\leadsto \mathsf{+.f64}\left(x, \mathsf{*.f64}\left(\mathsf{*.f64}\left(wj, wj\right), \mathsf{\_.f64}\left(1, \color{blue}{wj}\right)\right)\right) \]
            8. Simplified94.7%

              \[\leadsto x + \color{blue}{\left(wj \cdot wj\right) \cdot \left(1 - wj\right)} \]
            9. Taylor expanded in wj around 0

              \[\leadsto \color{blue}{x + {wj}^{2}} \]
            10. Step-by-step derivation
              1. +-commutativeN/A

                \[\leadsto {wj}^{2} + \color{blue}{x} \]
              2. +-lowering-+.f64N/A

                \[\leadsto \mathsf{+.f64}\left(\left({wj}^{2}\right), \color{blue}{x}\right) \]
              3. unpow2N/A

                \[\leadsto \mathsf{+.f64}\left(\left(wj \cdot wj\right), x\right) \]
              4. *-lowering-*.f6494.4%

                \[\leadsto \mathsf{+.f64}\left(\mathsf{*.f64}\left(wj, wj\right), x\right) \]
            11. Simplified94.4%

              \[\leadsto \color{blue}{wj \cdot wj + x} \]
            12. Final simplification94.4%

              \[\leadsto x + wj \cdot wj \]
            13. Add Preprocessing

            Alternative 11: 83.9% accurate, 313.0× speedup?

            \[\begin{array}{l} \\ x \end{array} \]
            (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}
            
            Derivation
            1. Initial program 78.0%

              \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
            2. Step-by-step derivation
              1. sub-negN/A

                \[\leadsto wj + \color{blue}{\left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\right)\right)} \]
              2. +-lowering-+.f64N/A

                \[\leadsto \mathsf{+.f64}\left(wj, \color{blue}{\left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\right)\right)}\right) \]
              3. distribute-rgt1-inN/A

                \[\leadsto \mathsf{+.f64}\left(wj, \left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{\left(wj + 1\right) \cdot e^{wj}}\right)\right)\right) \]
              4. associate-/l/N/A

                \[\leadsto \mathsf{+.f64}\left(wj, \left(\mathsf{neg}\left(\frac{\frac{wj \cdot e^{wj} - x}{e^{wj}}}{wj + 1}\right)\right)\right) \]
              5. distribute-neg-frac2N/A

                \[\leadsto \mathsf{+.f64}\left(wj, \left(\frac{\frac{wj \cdot e^{wj} - x}{e^{wj}}}{\color{blue}{\mathsf{neg}\left(\left(wj + 1\right)\right)}}\right)\right) \]
              6. /-lowering-/.f64N/A

                \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(\frac{wj \cdot e^{wj} - x}{e^{wj}}\right), \color{blue}{\left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)}\right)\right) \]
              7. div-subN/A

                \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(\frac{wj \cdot e^{wj}}{e^{wj}} - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\color{blue}{\left(wj + 1\right)}\right)\right)\right)\right) \]
              8. associate-/l*N/A

                \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj \cdot \frac{e^{wj}}{e^{wj}} - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(\color{blue}{wj} + 1\right)\right)\right)\right)\right) \]
              9. *-inversesN/A

                \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj \cdot 1 - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)\right)\right) \]
              10. *-rgt-identityN/A

                \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(\color{blue}{wj} + 1\right)\right)\right)\right)\right) \]
              11. --lowering--.f64N/A

                \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \left(\frac{x}{e^{wj}}\right)\right), \left(\mathsf{neg}\left(\color{blue}{\left(wj + 1\right)}\right)\right)\right)\right) \]
              12. /-lowering-/.f64N/A

                \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \left(e^{wj}\right)\right)\right), \left(\mathsf{neg}\left(\left(wj + \color{blue}{1}\right)\right)\right)\right)\right) \]
              13. exp-lowering-exp.f64N/A

                \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)\right)\right) \]
              14. +-commutativeN/A

                \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(1 + wj\right)\right)\right)\right)\right) \]
              15. *-inversesN/A

                \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(\frac{e^{wj}}{e^{wj}} + wj\right)\right)\right)\right)\right) \]
              16. distribute-neg-inN/A

                \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\left(\mathsf{neg}\left(\frac{e^{wj}}{e^{wj}}\right)\right) + \color{blue}{\left(\mathsf{neg}\left(wj\right)\right)}\right)\right)\right) \]
            3. Simplified80.0%

              \[\leadsto \color{blue}{wj + \frac{wj - \frac{x}{e^{wj}}}{-1 - wj}} \]
            4. Add Preprocessing
            5. Taylor expanded in wj around 0

              \[\leadsto \color{blue}{x} \]
            6. Step-by-step derivation
              1. Simplified83.1%

                \[\leadsto \color{blue}{x} \]
              2. Add Preprocessing

              Alternative 12: 4.3% accurate, 313.0× speedup?

              \[\begin{array}{l} \\ wj \end{array} \]
              (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}
              
              Derivation
              1. Initial program 78.0%

                \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
              2. Step-by-step derivation
                1. sub-negN/A

                  \[\leadsto wj + \color{blue}{\left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\right)\right)} \]
                2. +-lowering-+.f64N/A

                  \[\leadsto \mathsf{+.f64}\left(wj, \color{blue}{\left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\right)\right)}\right) \]
                3. distribute-rgt1-inN/A

                  \[\leadsto \mathsf{+.f64}\left(wj, \left(\mathsf{neg}\left(\frac{wj \cdot e^{wj} - x}{\left(wj + 1\right) \cdot e^{wj}}\right)\right)\right) \]
                4. associate-/l/N/A

                  \[\leadsto \mathsf{+.f64}\left(wj, \left(\mathsf{neg}\left(\frac{\frac{wj \cdot e^{wj} - x}{e^{wj}}}{wj + 1}\right)\right)\right) \]
                5. distribute-neg-frac2N/A

                  \[\leadsto \mathsf{+.f64}\left(wj, \left(\frac{\frac{wj \cdot e^{wj} - x}{e^{wj}}}{\color{blue}{\mathsf{neg}\left(\left(wj + 1\right)\right)}}\right)\right) \]
                6. /-lowering-/.f64N/A

                  \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(\frac{wj \cdot e^{wj} - x}{e^{wj}}\right), \color{blue}{\left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)}\right)\right) \]
                7. div-subN/A

                  \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(\frac{wj \cdot e^{wj}}{e^{wj}} - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\color{blue}{\left(wj + 1\right)}\right)\right)\right)\right) \]
                8. associate-/l*N/A

                  \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj \cdot \frac{e^{wj}}{e^{wj}} - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(\color{blue}{wj} + 1\right)\right)\right)\right)\right) \]
                9. *-inversesN/A

                  \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj \cdot 1 - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)\right)\right) \]
                10. *-rgt-identityN/A

                  \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\left(wj - \frac{x}{e^{wj}}\right), \left(\mathsf{neg}\left(\left(\color{blue}{wj} + 1\right)\right)\right)\right)\right) \]
                11. --lowering--.f64N/A

                  \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \left(\frac{x}{e^{wj}}\right)\right), \left(\mathsf{neg}\left(\color{blue}{\left(wj + 1\right)}\right)\right)\right)\right) \]
                12. /-lowering-/.f64N/A

                  \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \left(e^{wj}\right)\right)\right), \left(\mathsf{neg}\left(\left(wj + \color{blue}{1}\right)\right)\right)\right)\right) \]
                13. exp-lowering-exp.f64N/A

                  \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(wj + 1\right)\right)\right)\right)\right) \]
                14. +-commutativeN/A

                  \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(1 + wj\right)\right)\right)\right)\right) \]
                15. *-inversesN/A

                  \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\mathsf{neg}\left(\left(\frac{e^{wj}}{e^{wj}} + wj\right)\right)\right)\right)\right) \]
                16. distribute-neg-inN/A

                  \[\leadsto \mathsf{+.f64}\left(wj, \mathsf{/.f64}\left(\mathsf{\_.f64}\left(wj, \mathsf{/.f64}\left(x, \mathsf{exp.f64}\left(wj\right)\right)\right), \left(\left(\mathsf{neg}\left(\frac{e^{wj}}{e^{wj}}\right)\right) + \color{blue}{\left(\mathsf{neg}\left(wj\right)\right)}\right)\right)\right) \]
              3. Simplified80.0%

                \[\leadsto \color{blue}{wj + \frac{wj - \frac{x}{e^{wj}}}{-1 - wj}} \]
              4. Add Preprocessing
              5. Taylor expanded in wj around inf

                \[\leadsto \color{blue}{wj} \]
              6. Step-by-step derivation
                1. Simplified4.4%

                  \[\leadsto \color{blue}{wj} \]
                2. Add Preprocessing

                Alternative 13: 3.3% accurate, 313.0× speedup?

                \[\begin{array}{l} \\ -1 \end{array} \]
                (FPCore (wj x) :precision binary64 -1.0)
                double code(double wj, double x) {
                	return -1.0;
                }
                
                real(8) function code(wj, x)
                    real(8), intent (in) :: wj
                    real(8), intent (in) :: x
                    code = -1.0d0
                end function
                
                public static double code(double wj, double x) {
                	return -1.0;
                }
                
                def code(wj, x):
                	return -1.0
                
                function code(wj, x)
                	return -1.0
                end
                
                function tmp = code(wj, x)
                	tmp = -1.0;
                end
                
                code[wj_, x_] := -1.0
                
                \begin{array}{l}
                
                \\
                -1
                \end{array}
                
                Derivation
                1. Initial program 78.0%

                  \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
                2. Add Preprocessing
                3. Taylor expanded in wj around inf

                  \[\leadsto \mathsf{\_.f64}\left(wj, \color{blue}{1}\right) \]
                4. Step-by-step derivation
                  1. Simplified4.1%

                    \[\leadsto wj - \color{blue}{1} \]
                  2. Taylor expanded in wj around 0

                    \[\leadsto \color{blue}{-1} \]
                  3. Step-by-step derivation
                    1. Simplified3.2%

                      \[\leadsto \color{blue}{-1} \]
                    2. Add Preprocessing

                    Developer Target 1: 78.8% accurate, 1.5× speedup?

                    \[\begin{array}{l} \\ wj - \left(\frac{wj}{wj + 1} - \frac{x}{e^{wj} + wj \cdot e^{wj}}\right) \end{array} \]
                    (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}
                    

                    Reproduce

                    ?
                    herbie shell --seed 2024158 
                    (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))))))