symmetry log of sum of exp

Percentage Accurate: 53.4% → 98.5%
Time: 12.5s
Alternatives: 14
Speedup: 2.9×

Specification

?
\[\begin{array}{l} \\ \log \left(e^{a} + e^{b}\right) \end{array} \]
(FPCore (a b) :precision binary64 (log (+ (exp a) (exp b))))
double code(double a, double b) {
	return log((exp(a) + exp(b)));
}
real(8) function code(a, b)
    real(8), intent (in) :: a
    real(8), intent (in) :: b
    code = log((exp(a) + exp(b)))
end function
public static double code(double a, double b) {
	return Math.log((Math.exp(a) + Math.exp(b)));
}
def code(a, b):
	return math.log((math.exp(a) + math.exp(b)))
function code(a, b)
	return log(Float64(exp(a) + exp(b)))
end
function tmp = code(a, b)
	tmp = log((exp(a) + exp(b)));
end
code[a_, b_] := N[Log[N[(N[Exp[a], $MachinePrecision] + N[Exp[b], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
\begin{array}{l}

\\
\log \left(e^{a} + e^{b}\right)
\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 14 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: 53.4% accurate, 1.0× speedup?

\[\begin{array}{l} \\ \log \left(e^{a} + e^{b}\right) \end{array} \]
(FPCore (a b) :precision binary64 (log (+ (exp a) (exp b))))
double code(double a, double b) {
	return log((exp(a) + exp(b)));
}
real(8) function code(a, b)
    real(8), intent (in) :: a
    real(8), intent (in) :: b
    code = log((exp(a) + exp(b)))
end function
public static double code(double a, double b) {
	return Math.log((Math.exp(a) + Math.exp(b)));
}
def code(a, b):
	return math.log((math.exp(a) + math.exp(b)))
function code(a, b)
	return log(Float64(exp(a) + exp(b)))
end
function tmp = code(a, b)
	tmp = log((exp(a) + exp(b)));
end
code[a_, b_] := N[Log[N[(N[Exp[a], $MachinePrecision] + N[Exp[b], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
\begin{array}{l}

\\
\log \left(e^{a} + e^{b}\right)
\end{array}

Alternative 1: 98.5% accurate, 1.4× speedup?

\[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;a \leq -5.5 \cdot 10^{+50}:\\ \;\;\;\;\frac{b}{e^{a} + 1}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{log1p}\left(e^{a} + b \cdot \left(1 + b \cdot 0.5\right)\right)\\ \end{array} \end{array} \]
NOTE: a and b should be sorted in increasing order before calling this function.
(FPCore (a b)
 :precision binary64
 (if (<= a -5.5e+50)
   (/ b (+ (exp a) 1.0))
   (log1p (+ (exp a) (* b (+ 1.0 (* b 0.5)))))))
assert(a < b);
double code(double a, double b) {
	double tmp;
	if (a <= -5.5e+50) {
		tmp = b / (exp(a) + 1.0);
	} else {
		tmp = log1p((exp(a) + (b * (1.0 + (b * 0.5)))));
	}
	return tmp;
}
assert a < b;
public static double code(double a, double b) {
	double tmp;
	if (a <= -5.5e+50) {
		tmp = b / (Math.exp(a) + 1.0);
	} else {
		tmp = Math.log1p((Math.exp(a) + (b * (1.0 + (b * 0.5)))));
	}
	return tmp;
}
[a, b] = sort([a, b])
def code(a, b):
	tmp = 0
	if a <= -5.5e+50:
		tmp = b / (math.exp(a) + 1.0)
	else:
		tmp = math.log1p((math.exp(a) + (b * (1.0 + (b * 0.5)))))
	return tmp
a, b = sort([a, b])
function code(a, b)
	tmp = 0.0
	if (a <= -5.5e+50)
		tmp = Float64(b / Float64(exp(a) + 1.0));
	else
		tmp = log1p(Float64(exp(a) + Float64(b * Float64(1.0 + Float64(b * 0.5)))));
	end
	return tmp
end
NOTE: a and b should be sorted in increasing order before calling this function.
code[a_, b_] := If[LessEqual[a, -5.5e+50], N[(b / N[(N[Exp[a], $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision], N[Log[1 + N[(N[Exp[a], $MachinePrecision] + N[(b * N[(1.0 + N[(b * 0.5), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]]
\begin{array}{l}
[a, b] = \mathsf{sort}([a, b])\\
\\
\begin{array}{l}
\mathbf{if}\;a \leq -5.5 \cdot 10^{+50}:\\
\;\;\;\;\frac{b}{e^{a} + 1}\\

\mathbf{else}:\\
\;\;\;\;\mathsf{log1p}\left(e^{a} + b \cdot \left(1 + b \cdot 0.5\right)\right)\\


\end{array}
\end{array}
Derivation
  1. Split input into 2 regimes
  2. if a < -5.4999999999999998e50

    1. Initial program 10.7%

      \[\log \left(e^{a} + e^{b}\right) \]
    2. Add Preprocessing
    3. Taylor expanded in b around 0

      \[\leadsto \color{blue}{\log \left(1 + e^{a}\right) + \frac{b}{1 + e^{a}}} \]
    4. Step-by-step derivation
      1. *-rgt-identityN/A

        \[\leadsto \log \left(1 + e^{a}\right) + \frac{b \cdot 1}{\color{blue}{1} + e^{a}} \]
      2. associate-*r/N/A

        \[\leadsto \log \left(1 + e^{a}\right) + b \cdot \color{blue}{\frac{1}{1 + e^{a}}} \]
      3. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(\log \left(1 + e^{a}\right), \color{blue}{\left(b \cdot \frac{1}{1 + e^{a}}\right)}\right) \]
      4. log1p-defineN/A

        \[\leadsto \mathsf{+.f64}\left(\left(\mathsf{log1p}\left(e^{a}\right)\right), \left(\color{blue}{b} \cdot \frac{1}{1 + e^{a}}\right)\right) \]
      5. log1p-lowering-log1p.f64N/A

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

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(b \cdot \frac{1}{1 + e^{a}}\right)\right) \]
      7. associate-*r/N/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b \cdot 1}{\color{blue}{1 + e^{a}}}\right)\right) \]
      8. *-rgt-identityN/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b}{\color{blue}{1} + e^{a}}\right)\right) \]
      9. /-lowering-/.f64N/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right)\right) \]
      10. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right)\right) \]
      11. exp-lowering-exp.f64100.0%

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right)\right) \]
    5. Simplified100.0%

      \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}} \]
    6. Taylor expanded in b around inf

      \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
    7. Step-by-step derivation
      1. /-lowering-/.f64N/A

        \[\leadsto \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right) \]
      2. +-lowering-+.f64N/A

        \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right) \]
      3. exp-lowering-exp.f64100.0%

        \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right) \]
    8. Simplified100.0%

      \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]

    if -5.4999999999999998e50 < a

    1. Initial program 63.6%

      \[\log \left(e^{a} + e^{b}\right) \]
    2. Add Preprocessing
    3. Taylor expanded in b around 0

      \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \color{blue}{\left(1 + b \cdot \left(1 + \frac{1}{2} \cdot b\right)\right)}\right)\right) \]
    4. Step-by-step derivation
      1. +-lowering-+.f64N/A

        \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \left(b \cdot \left(1 + \frac{1}{2} \cdot b\right)\right)\right)\right)\right) \]
      2. *-lowering-*.f64N/A

        \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \left(1 + \frac{1}{2} \cdot b\right)\right)\right)\right)\right) \]
      3. +-lowering-+.f64N/A

        \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \mathsf{+.f64}\left(1, \left(\frac{1}{2} \cdot b\right)\right)\right)\right)\right)\right) \]
      4. *-commutativeN/A

        \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \mathsf{+.f64}\left(1, \left(b \cdot \frac{1}{2}\right)\right)\right)\right)\right)\right) \]
      5. *-lowering-*.f6457.5%

        \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \frac{1}{2}\right)\right)\right)\right)\right)\right) \]
    5. Simplified57.5%

      \[\leadsto \log \left(e^{a} + \color{blue}{\left(1 + b \cdot \left(1 + b \cdot 0.5\right)\right)}\right) \]
    6. Step-by-step derivation
      1. +-commutativeN/A

        \[\leadsto \log \left(\left(1 + b \cdot \left(1 + b \cdot \frac{1}{2}\right)\right) + e^{a}\right) \]
      2. associate-+l+N/A

        \[\leadsto \log \left(1 + \left(b \cdot \left(1 + b \cdot \frac{1}{2}\right) + e^{a}\right)\right) \]
      3. log1p-defineN/A

        \[\leadsto \mathsf{log1p}\left(b \cdot \left(1 + b \cdot \frac{1}{2}\right) + e^{a}\right) \]
      4. log1p-lowering-log1p.f64N/A

        \[\leadsto \mathsf{log1p.f64}\left(\left(b \cdot \left(1 + b \cdot \frac{1}{2}\right) + e^{a}\right)\right) \]
      5. +-lowering-+.f64N/A

        \[\leadsto \mathsf{log1p.f64}\left(\mathsf{+.f64}\left(\left(b \cdot \left(1 + b \cdot \frac{1}{2}\right)\right), \left(e^{a}\right)\right)\right) \]
      6. *-lowering-*.f64N/A

        \[\leadsto \mathsf{log1p.f64}\left(\mathsf{+.f64}\left(\mathsf{*.f64}\left(b, \left(1 + b \cdot \frac{1}{2}\right)\right), \left(e^{a}\right)\right)\right) \]
      7. +-lowering-+.f64N/A

        \[\leadsto \mathsf{log1p.f64}\left(\mathsf{+.f64}\left(\mathsf{*.f64}\left(b, \mathsf{+.f64}\left(1, \left(b \cdot \frac{1}{2}\right)\right)\right), \left(e^{a}\right)\right)\right) \]
      8. *-lowering-*.f64N/A

        \[\leadsto \mathsf{log1p.f64}\left(\mathsf{+.f64}\left(\mathsf{*.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \frac{1}{2}\right)\right)\right), \left(e^{a}\right)\right)\right) \]
      9. exp-lowering-exp.f6463.2%

        \[\leadsto \mathsf{log1p.f64}\left(\mathsf{+.f64}\left(\mathsf{*.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \frac{1}{2}\right)\right)\right), \mathsf{exp.f64}\left(a\right)\right)\right) \]
    7. Applied egg-rr63.2%

      \[\leadsto \color{blue}{\mathsf{log1p}\left(b \cdot \left(1 + b \cdot 0.5\right) + e^{a}\right)} \]
  3. Recombined 2 regimes into one program.
  4. Final simplification71.0%

    \[\leadsto \begin{array}{l} \mathbf{if}\;a \leq -5.5 \cdot 10^{+50}:\\ \;\;\;\;\frac{b}{e^{a} + 1}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{log1p}\left(e^{a} + b \cdot \left(1 + b \cdot 0.5\right)\right)\\ \end{array} \]
  5. Add Preprocessing

Alternative 2: 98.5% accurate, 1.0× speedup?

\[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;e^{a} \leq 0:\\ \;\;\;\;\frac{b}{e^{a} + 1}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{log1p}\left(e^{a}\right) + \frac{1}{\frac{2}{b}}\\ \end{array} \end{array} \]
NOTE: a and b should be sorted in increasing order before calling this function.
(FPCore (a b)
 :precision binary64
 (if (<= (exp a) 0.0)
   (/ b (+ (exp a) 1.0))
   (+ (log1p (exp a)) (/ 1.0 (/ 2.0 b)))))
assert(a < b);
double code(double a, double b) {
	double tmp;
	if (exp(a) <= 0.0) {
		tmp = b / (exp(a) + 1.0);
	} else {
		tmp = log1p(exp(a)) + (1.0 / (2.0 / b));
	}
	return tmp;
}
assert a < b;
public static double code(double a, double b) {
	double tmp;
	if (Math.exp(a) <= 0.0) {
		tmp = b / (Math.exp(a) + 1.0);
	} else {
		tmp = Math.log1p(Math.exp(a)) + (1.0 / (2.0 / b));
	}
	return tmp;
}
[a, b] = sort([a, b])
def code(a, b):
	tmp = 0
	if math.exp(a) <= 0.0:
		tmp = b / (math.exp(a) + 1.0)
	else:
		tmp = math.log1p(math.exp(a)) + (1.0 / (2.0 / b))
	return tmp
a, b = sort([a, b])
function code(a, b)
	tmp = 0.0
	if (exp(a) <= 0.0)
		tmp = Float64(b / Float64(exp(a) + 1.0));
	else
		tmp = Float64(log1p(exp(a)) + Float64(1.0 / Float64(2.0 / b)));
	end
	return tmp
end
NOTE: a and b should be sorted in increasing order before calling this function.
code[a_, b_] := If[LessEqual[N[Exp[a], $MachinePrecision], 0.0], N[(b / N[(N[Exp[a], $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision], N[(N[Log[1 + N[Exp[a], $MachinePrecision]], $MachinePrecision] + N[(1.0 / N[(2.0 / b), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
[a, b] = \mathsf{sort}([a, b])\\
\\
\begin{array}{l}
\mathbf{if}\;e^{a} \leq 0:\\
\;\;\;\;\frac{b}{e^{a} + 1}\\

\mathbf{else}:\\
\;\;\;\;\mathsf{log1p}\left(e^{a}\right) + \frac{1}{\frac{2}{b}}\\


\end{array}
\end{array}
Derivation
  1. Split input into 2 regimes
  2. if (exp.f64 a) < 0.0

    1. Initial program 9.9%

      \[\log \left(e^{a} + e^{b}\right) \]
    2. Add Preprocessing
    3. Taylor expanded in b around 0

      \[\leadsto \color{blue}{\log \left(1 + e^{a}\right) + \frac{b}{1 + e^{a}}} \]
    4. Step-by-step derivation
      1. *-rgt-identityN/A

        \[\leadsto \log \left(1 + e^{a}\right) + \frac{b \cdot 1}{\color{blue}{1} + e^{a}} \]
      2. associate-*r/N/A

        \[\leadsto \log \left(1 + e^{a}\right) + b \cdot \color{blue}{\frac{1}{1 + e^{a}}} \]
      3. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(\log \left(1 + e^{a}\right), \color{blue}{\left(b \cdot \frac{1}{1 + e^{a}}\right)}\right) \]
      4. log1p-defineN/A

        \[\leadsto \mathsf{+.f64}\left(\left(\mathsf{log1p}\left(e^{a}\right)\right), \left(\color{blue}{b} \cdot \frac{1}{1 + e^{a}}\right)\right) \]
      5. log1p-lowering-log1p.f64N/A

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

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(b \cdot \frac{1}{1 + e^{a}}\right)\right) \]
      7. associate-*r/N/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b \cdot 1}{\color{blue}{1 + e^{a}}}\right)\right) \]
      8. *-rgt-identityN/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b}{\color{blue}{1} + e^{a}}\right)\right) \]
      9. /-lowering-/.f64N/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right)\right) \]
      10. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right)\right) \]
      11. exp-lowering-exp.f64100.0%

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right)\right) \]
    5. Simplified100.0%

      \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}} \]
    6. Taylor expanded in b around inf

      \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
    7. Step-by-step derivation
      1. /-lowering-/.f64N/A

        \[\leadsto \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right) \]
      2. +-lowering-+.f64N/A

        \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right) \]
      3. exp-lowering-exp.f64100.0%

        \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right) \]
    8. Simplified100.0%

      \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]

    if 0.0 < (exp.f64 a)

    1. Initial program 66.3%

      \[\log \left(e^{a} + e^{b}\right) \]
    2. Add Preprocessing
    3. Taylor expanded in b around 0

      \[\leadsto \color{blue}{\log \left(1 + e^{a}\right) + \frac{b}{1 + e^{a}}} \]
    4. Step-by-step derivation
      1. *-rgt-identityN/A

        \[\leadsto \log \left(1 + e^{a}\right) + \frac{b \cdot 1}{\color{blue}{1} + e^{a}} \]
      2. associate-*r/N/A

        \[\leadsto \log \left(1 + e^{a}\right) + b \cdot \color{blue}{\frac{1}{1 + e^{a}}} \]
      3. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(\log \left(1 + e^{a}\right), \color{blue}{\left(b \cdot \frac{1}{1 + e^{a}}\right)}\right) \]
      4. log1p-defineN/A

        \[\leadsto \mathsf{+.f64}\left(\left(\mathsf{log1p}\left(e^{a}\right)\right), \left(\color{blue}{b} \cdot \frac{1}{1 + e^{a}}\right)\right) \]
      5. log1p-lowering-log1p.f64N/A

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

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(b \cdot \frac{1}{1 + e^{a}}\right)\right) \]
      7. associate-*r/N/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b \cdot 1}{\color{blue}{1 + e^{a}}}\right)\right) \]
      8. *-rgt-identityN/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b}{\color{blue}{1} + e^{a}}\right)\right) \]
      9. /-lowering-/.f64N/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right)\right) \]
      10. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right)\right) \]
      11. exp-lowering-exp.f6461.1%

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right)\right) \]
    5. Simplified61.1%

      \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}} \]
    6. Step-by-step derivation
      1. clear-numN/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{1}{\color{blue}{\frac{1 + e^{a}}{b}}}\right)\right) \]
      2. /-lowering-/.f64N/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(1, \color{blue}{\left(\frac{1 + e^{a}}{b}\right)}\right)\right) \]
      3. /-lowering-/.f64N/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(1, \mathsf{/.f64}\left(\left(1 + e^{a}\right), \color{blue}{b}\right)\right)\right) \]
      4. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(1, \mathsf{/.f64}\left(\mathsf{+.f64}\left(1, \left(e^{a}\right)\right), b\right)\right)\right) \]
      5. exp-lowering-exp.f6461.1%

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(1, \mathsf{/.f64}\left(\mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right), b\right)\right)\right) \]
    7. Applied egg-rr61.1%

      \[\leadsto \mathsf{log1p}\left(e^{a}\right) + \color{blue}{\frac{1}{\frac{1 + e^{a}}{b}}} \]
    8. Taylor expanded in a around 0

      \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(1, \mathsf{/.f64}\left(\color{blue}{2}, b\right)\right)\right) \]
    9. Step-by-step derivation
      1. Simplified61.1%

        \[\leadsto \mathsf{log1p}\left(e^{a}\right) + \frac{1}{\frac{\color{blue}{2}}{b}} \]
    10. Recombined 2 regimes into one program.
    11. Final simplification70.7%

      \[\leadsto \begin{array}{l} \mathbf{if}\;e^{a} \leq 0:\\ \;\;\;\;\frac{b}{e^{a} + 1}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{log1p}\left(e^{a}\right) + \frac{1}{\frac{2}{b}}\\ \end{array} \]
    12. Add Preprocessing

    Alternative 3: 98.6% accurate, 1.0× speedup?

    \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;e^{a} \leq 0:\\ \;\;\;\;\frac{b}{e^{a} + 1}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{log1p}\left(e^{a} + b\right)\\ \end{array} \end{array} \]
    NOTE: a and b should be sorted in increasing order before calling this function.
    (FPCore (a b)
     :precision binary64
     (if (<= (exp a) 0.0) (/ b (+ (exp a) 1.0)) (log1p (+ (exp a) b))))
    assert(a < b);
    double code(double a, double b) {
    	double tmp;
    	if (exp(a) <= 0.0) {
    		tmp = b / (exp(a) + 1.0);
    	} else {
    		tmp = log1p((exp(a) + b));
    	}
    	return tmp;
    }
    
    assert a < b;
    public static double code(double a, double b) {
    	double tmp;
    	if (Math.exp(a) <= 0.0) {
    		tmp = b / (Math.exp(a) + 1.0);
    	} else {
    		tmp = Math.log1p((Math.exp(a) + b));
    	}
    	return tmp;
    }
    
    [a, b] = sort([a, b])
    def code(a, b):
    	tmp = 0
    	if math.exp(a) <= 0.0:
    		tmp = b / (math.exp(a) + 1.0)
    	else:
    		tmp = math.log1p((math.exp(a) + b))
    	return tmp
    
    a, b = sort([a, b])
    function code(a, b)
    	tmp = 0.0
    	if (exp(a) <= 0.0)
    		tmp = Float64(b / Float64(exp(a) + 1.0));
    	else
    		tmp = log1p(Float64(exp(a) + b));
    	end
    	return tmp
    end
    
    NOTE: a and b should be sorted in increasing order before calling this function.
    code[a_, b_] := If[LessEqual[N[Exp[a], $MachinePrecision], 0.0], N[(b / N[(N[Exp[a], $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision], N[Log[1 + N[(N[Exp[a], $MachinePrecision] + b), $MachinePrecision]], $MachinePrecision]]
    
    \begin{array}{l}
    [a, b] = \mathsf{sort}([a, b])\\
    \\
    \begin{array}{l}
    \mathbf{if}\;e^{a} \leq 0:\\
    \;\;\;\;\frac{b}{e^{a} + 1}\\
    
    \mathbf{else}:\\
    \;\;\;\;\mathsf{log1p}\left(e^{a} + b\right)\\
    
    
    \end{array}
    \end{array}
    
    Derivation
    1. Split input into 2 regimes
    2. if (exp.f64 a) < 0.0

      1. Initial program 9.9%

        \[\log \left(e^{a} + e^{b}\right) \]
      2. Add Preprocessing
      3. Taylor expanded in b around 0

        \[\leadsto \color{blue}{\log \left(1 + e^{a}\right) + \frac{b}{1 + e^{a}}} \]
      4. Step-by-step derivation
        1. *-rgt-identityN/A

          \[\leadsto \log \left(1 + e^{a}\right) + \frac{b \cdot 1}{\color{blue}{1} + e^{a}} \]
        2. associate-*r/N/A

          \[\leadsto \log \left(1 + e^{a}\right) + b \cdot \color{blue}{\frac{1}{1 + e^{a}}} \]
        3. +-lowering-+.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\log \left(1 + e^{a}\right), \color{blue}{\left(b \cdot \frac{1}{1 + e^{a}}\right)}\right) \]
        4. log1p-defineN/A

          \[\leadsto \mathsf{+.f64}\left(\left(\mathsf{log1p}\left(e^{a}\right)\right), \left(\color{blue}{b} \cdot \frac{1}{1 + e^{a}}\right)\right) \]
        5. log1p-lowering-log1p.f64N/A

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

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(b \cdot \frac{1}{1 + e^{a}}\right)\right) \]
        7. associate-*r/N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b \cdot 1}{\color{blue}{1 + e^{a}}}\right)\right) \]
        8. *-rgt-identityN/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b}{\color{blue}{1} + e^{a}}\right)\right) \]
        9. /-lowering-/.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right)\right) \]
        10. +-lowering-+.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right)\right) \]
        11. exp-lowering-exp.f64100.0%

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right)\right) \]
      5. Simplified100.0%

        \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}} \]
      6. Taylor expanded in b around inf

        \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
      7. Step-by-step derivation
        1. /-lowering-/.f64N/A

          \[\leadsto \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right) \]
        2. +-lowering-+.f64N/A

          \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right) \]
        3. exp-lowering-exp.f64100.0%

          \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right) \]
      8. Simplified100.0%

        \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]

      if 0.0 < (exp.f64 a)

      1. Initial program 66.3%

        \[\log \left(e^{a} + e^{b}\right) \]
      2. Add Preprocessing
      3. Taylor expanded in b around 0

        \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \color{blue}{\left(1 + b \cdot \left(1 + \frac{1}{2} \cdot b\right)\right)}\right)\right) \]
      4. Step-by-step derivation
        1. +-lowering-+.f64N/A

          \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \left(b \cdot \left(1 + \frac{1}{2} \cdot b\right)\right)\right)\right)\right) \]
        2. *-lowering-*.f64N/A

          \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \left(1 + \frac{1}{2} \cdot b\right)\right)\right)\right)\right) \]
        3. +-lowering-+.f64N/A

          \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \mathsf{+.f64}\left(1, \left(\frac{1}{2} \cdot b\right)\right)\right)\right)\right)\right) \]
        4. *-commutativeN/A

          \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \mathsf{+.f64}\left(1, \left(b \cdot \frac{1}{2}\right)\right)\right)\right)\right)\right) \]
        5. *-lowering-*.f6460.0%

          \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \frac{1}{2}\right)\right)\right)\right)\right)\right) \]
      5. Simplified60.0%

        \[\leadsto \log \left(e^{a} + \color{blue}{\left(1 + b \cdot \left(1 + b \cdot 0.5\right)\right)}\right) \]
      6. Taylor expanded in b around 0

        \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \color{blue}{\left(1 + b\right)}\right)\right) \]
      7. Step-by-step derivation
        1. +-commutativeN/A

          \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \left(b + 1\right)\right)\right) \]
        2. +-lowering-+.f6458.6%

          \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(b, 1\right)\right)\right) \]
      8. Simplified58.6%

        \[\leadsto \log \left(e^{a} + \color{blue}{\left(b + 1\right)}\right) \]
      9. Step-by-step derivation
        1. associate-+r+N/A

          \[\leadsto \log \left(\left(e^{a} + b\right) + 1\right) \]
        2. +-commutativeN/A

          \[\leadsto \log \left(1 + \left(e^{a} + b\right)\right) \]
        3. log1p-defineN/A

          \[\leadsto \mathsf{log1p}\left(e^{a} + b\right) \]
        4. log1p-lowering-log1p.f64N/A

          \[\leadsto \mathsf{log1p.f64}\left(\left(e^{a} + b\right)\right) \]
        5. +-lowering-+.f64N/A

          \[\leadsto \mathsf{log1p.f64}\left(\mathsf{+.f64}\left(\left(e^{a}\right), b\right)\right) \]
        6. exp-lowering-exp.f6460.1%

          \[\leadsto \mathsf{log1p.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), b\right)\right) \]
      10. Applied egg-rr60.1%

        \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a} + b\right)} \]
    3. Recombined 2 regimes into one program.
    4. Final simplification69.9%

      \[\leadsto \begin{array}{l} \mathbf{if}\;e^{a} \leq 0:\\ \;\;\;\;\frac{b}{e^{a} + 1}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{log1p}\left(e^{a} + b\right)\\ \end{array} \]
    5. Add Preprocessing

    Alternative 4: 98.6% accurate, 1.0× speedup?

    \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \mathsf{log1p}\left(e^{a}\right) + \frac{b}{e^{a} + 1} \end{array} \]
    NOTE: a and b should be sorted in increasing order before calling this function.
    (FPCore (a b) :precision binary64 (+ (log1p (exp a)) (/ b (+ (exp a) 1.0))))
    assert(a < b);
    double code(double a, double b) {
    	return log1p(exp(a)) + (b / (exp(a) + 1.0));
    }
    
    assert a < b;
    public static double code(double a, double b) {
    	return Math.log1p(Math.exp(a)) + (b / (Math.exp(a) + 1.0));
    }
    
    [a, b] = sort([a, b])
    def code(a, b):
    	return math.log1p(math.exp(a)) + (b / (math.exp(a) + 1.0))
    
    a, b = sort([a, b])
    function code(a, b)
    	return Float64(log1p(exp(a)) + Float64(b / Float64(exp(a) + 1.0)))
    end
    
    NOTE: a and b should be sorted in increasing order before calling this function.
    code[a_, b_] := N[(N[Log[1 + N[Exp[a], $MachinePrecision]], $MachinePrecision] + N[(b / N[(N[Exp[a], $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
    
    \begin{array}{l}
    [a, b] = \mathsf{sort}([a, b])\\
    \\
    \mathsf{log1p}\left(e^{a}\right) + \frac{b}{e^{a} + 1}
    \end{array}
    
    Derivation
    1. Initial program 52.4%

      \[\log \left(e^{a} + e^{b}\right) \]
    2. Add Preprocessing
    3. Taylor expanded in b around 0

      \[\leadsto \color{blue}{\log \left(1 + e^{a}\right) + \frac{b}{1 + e^{a}}} \]
    4. Step-by-step derivation
      1. *-rgt-identityN/A

        \[\leadsto \log \left(1 + e^{a}\right) + \frac{b \cdot 1}{\color{blue}{1} + e^{a}} \]
      2. associate-*r/N/A

        \[\leadsto \log \left(1 + e^{a}\right) + b \cdot \color{blue}{\frac{1}{1 + e^{a}}} \]
      3. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(\log \left(1 + e^{a}\right), \color{blue}{\left(b \cdot \frac{1}{1 + e^{a}}\right)}\right) \]
      4. log1p-defineN/A

        \[\leadsto \mathsf{+.f64}\left(\left(\mathsf{log1p}\left(e^{a}\right)\right), \left(\color{blue}{b} \cdot \frac{1}{1 + e^{a}}\right)\right) \]
      5. log1p-lowering-log1p.f64N/A

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

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(b \cdot \frac{1}{1 + e^{a}}\right)\right) \]
      7. associate-*r/N/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b \cdot 1}{\color{blue}{1 + e^{a}}}\right)\right) \]
      8. *-rgt-identityN/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b}{\color{blue}{1} + e^{a}}\right)\right) \]
      9. /-lowering-/.f64N/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right)\right) \]
      10. +-lowering-+.f64N/A

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right)\right) \]
      11. exp-lowering-exp.f6470.7%

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right)\right) \]
    5. Simplified70.7%

      \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}} \]
    6. Final simplification70.7%

      \[\leadsto \mathsf{log1p}\left(e^{a}\right) + \frac{b}{e^{a} + 1} \]
    7. Add Preprocessing

    Alternative 5: 97.9% accurate, 1.0× speedup?

    \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;e^{a} \leq 0:\\ \;\;\;\;\frac{b}{e^{a} + 1}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{log1p}\left(e^{a}\right)\\ \end{array} \end{array} \]
    NOTE: a and b should be sorted in increasing order before calling this function.
    (FPCore (a b)
     :precision binary64
     (if (<= (exp a) 0.0) (/ b (+ (exp a) 1.0)) (log1p (exp a))))
    assert(a < b);
    double code(double a, double b) {
    	double tmp;
    	if (exp(a) <= 0.0) {
    		tmp = b / (exp(a) + 1.0);
    	} else {
    		tmp = log1p(exp(a));
    	}
    	return tmp;
    }
    
    assert a < b;
    public static double code(double a, double b) {
    	double tmp;
    	if (Math.exp(a) <= 0.0) {
    		tmp = b / (Math.exp(a) + 1.0);
    	} else {
    		tmp = Math.log1p(Math.exp(a));
    	}
    	return tmp;
    }
    
    [a, b] = sort([a, b])
    def code(a, b):
    	tmp = 0
    	if math.exp(a) <= 0.0:
    		tmp = b / (math.exp(a) + 1.0)
    	else:
    		tmp = math.log1p(math.exp(a))
    	return tmp
    
    a, b = sort([a, b])
    function code(a, b)
    	tmp = 0.0
    	if (exp(a) <= 0.0)
    		tmp = Float64(b / Float64(exp(a) + 1.0));
    	else
    		tmp = log1p(exp(a));
    	end
    	return tmp
    end
    
    NOTE: a and b should be sorted in increasing order before calling this function.
    code[a_, b_] := If[LessEqual[N[Exp[a], $MachinePrecision], 0.0], N[(b / N[(N[Exp[a], $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision], N[Log[1 + N[Exp[a], $MachinePrecision]], $MachinePrecision]]
    
    \begin{array}{l}
    [a, b] = \mathsf{sort}([a, b])\\
    \\
    \begin{array}{l}
    \mathbf{if}\;e^{a} \leq 0:\\
    \;\;\;\;\frac{b}{e^{a} + 1}\\
    
    \mathbf{else}:\\
    \;\;\;\;\mathsf{log1p}\left(e^{a}\right)\\
    
    
    \end{array}
    \end{array}
    
    Derivation
    1. Split input into 2 regimes
    2. if (exp.f64 a) < 0.0

      1. Initial program 9.9%

        \[\log \left(e^{a} + e^{b}\right) \]
      2. Add Preprocessing
      3. Taylor expanded in b around 0

        \[\leadsto \color{blue}{\log \left(1 + e^{a}\right) + \frac{b}{1 + e^{a}}} \]
      4. Step-by-step derivation
        1. *-rgt-identityN/A

          \[\leadsto \log \left(1 + e^{a}\right) + \frac{b \cdot 1}{\color{blue}{1} + e^{a}} \]
        2. associate-*r/N/A

          \[\leadsto \log \left(1 + e^{a}\right) + b \cdot \color{blue}{\frac{1}{1 + e^{a}}} \]
        3. +-lowering-+.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\log \left(1 + e^{a}\right), \color{blue}{\left(b \cdot \frac{1}{1 + e^{a}}\right)}\right) \]
        4. log1p-defineN/A

          \[\leadsto \mathsf{+.f64}\left(\left(\mathsf{log1p}\left(e^{a}\right)\right), \left(\color{blue}{b} \cdot \frac{1}{1 + e^{a}}\right)\right) \]
        5. log1p-lowering-log1p.f64N/A

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

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(b \cdot \frac{1}{1 + e^{a}}\right)\right) \]
        7. associate-*r/N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b \cdot 1}{\color{blue}{1 + e^{a}}}\right)\right) \]
        8. *-rgt-identityN/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b}{\color{blue}{1} + e^{a}}\right)\right) \]
        9. /-lowering-/.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right)\right) \]
        10. +-lowering-+.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right)\right) \]
        11. exp-lowering-exp.f64100.0%

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right)\right) \]
      5. Simplified100.0%

        \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}} \]
      6. Taylor expanded in b around inf

        \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
      7. Step-by-step derivation
        1. /-lowering-/.f64N/A

          \[\leadsto \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right) \]
        2. +-lowering-+.f64N/A

          \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right) \]
        3. exp-lowering-exp.f64100.0%

          \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right) \]
      8. Simplified100.0%

        \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]

      if 0.0 < (exp.f64 a)

      1. Initial program 66.3%

        \[\log \left(e^{a} + e^{b}\right) \]
      2. Add Preprocessing
      3. Taylor expanded in b around 0

        \[\leadsto \color{blue}{\log \left(1 + e^{a}\right)} \]
      4. Step-by-step derivation
        1. log1p-defineN/A

          \[\leadsto \mathsf{log1p}\left(e^{a}\right) \]
        2. log1p-lowering-log1p.f64N/A

          \[\leadsto \mathsf{log1p.f64}\left(\left(e^{a}\right)\right) \]
        3. exp-lowering-exp.f6461.4%

          \[\leadsto \mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right) \]
      5. Simplified61.4%

        \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right)} \]
    3. Recombined 2 regimes into one program.
    4. Final simplification70.9%

      \[\leadsto \begin{array}{l} \mathbf{if}\;e^{a} \leq 0:\\ \;\;\;\;\frac{b}{e^{a} + 1}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{log1p}\left(e^{a}\right)\\ \end{array} \]
    5. Add Preprocessing

    Alternative 6: 97.9% accurate, 1.4× speedup?

    \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;e^{a} \leq 0:\\ \;\;\;\;\frac{b}{e^{a} + 1}\\ \mathbf{else}:\\ \;\;\;\;b \cdot 0.5 + \left(a \cdot \left(0.5 + \left(a \cdot 0.125 + b \cdot -0.25\right)\right) + \log 2\right)\\ \end{array} \end{array} \]
    NOTE: a and b should be sorted in increasing order before calling this function.
    (FPCore (a b)
     :precision binary64
     (if (<= (exp a) 0.0)
       (/ b (+ (exp a) 1.0))
       (+ (* b 0.5) (+ (* a (+ 0.5 (+ (* a 0.125) (* b -0.25)))) (log 2.0)))))
    assert(a < b);
    double code(double a, double b) {
    	double tmp;
    	if (exp(a) <= 0.0) {
    		tmp = b / (exp(a) + 1.0);
    	} else {
    		tmp = (b * 0.5) + ((a * (0.5 + ((a * 0.125) + (b * -0.25)))) + log(2.0));
    	}
    	return tmp;
    }
    
    NOTE: a and b should be sorted in increasing order before calling this function.
    real(8) function code(a, b)
        real(8), intent (in) :: a
        real(8), intent (in) :: b
        real(8) :: tmp
        if (exp(a) <= 0.0d0) then
            tmp = b / (exp(a) + 1.0d0)
        else
            tmp = (b * 0.5d0) + ((a * (0.5d0 + ((a * 0.125d0) + (b * (-0.25d0))))) + log(2.0d0))
        end if
        code = tmp
    end function
    
    assert a < b;
    public static double code(double a, double b) {
    	double tmp;
    	if (Math.exp(a) <= 0.0) {
    		tmp = b / (Math.exp(a) + 1.0);
    	} else {
    		tmp = (b * 0.5) + ((a * (0.5 + ((a * 0.125) + (b * -0.25)))) + Math.log(2.0));
    	}
    	return tmp;
    }
    
    [a, b] = sort([a, b])
    def code(a, b):
    	tmp = 0
    	if math.exp(a) <= 0.0:
    		tmp = b / (math.exp(a) + 1.0)
    	else:
    		tmp = (b * 0.5) + ((a * (0.5 + ((a * 0.125) + (b * -0.25)))) + math.log(2.0))
    	return tmp
    
    a, b = sort([a, b])
    function code(a, b)
    	tmp = 0.0
    	if (exp(a) <= 0.0)
    		tmp = Float64(b / Float64(exp(a) + 1.0));
    	else
    		tmp = Float64(Float64(b * 0.5) + Float64(Float64(a * Float64(0.5 + Float64(Float64(a * 0.125) + Float64(b * -0.25)))) + log(2.0)));
    	end
    	return tmp
    end
    
    a, b = num2cell(sort([a, b])){:}
    function tmp_2 = code(a, b)
    	tmp = 0.0;
    	if (exp(a) <= 0.0)
    		tmp = b / (exp(a) + 1.0);
    	else
    		tmp = (b * 0.5) + ((a * (0.5 + ((a * 0.125) + (b * -0.25)))) + log(2.0));
    	end
    	tmp_2 = tmp;
    end
    
    NOTE: a and b should be sorted in increasing order before calling this function.
    code[a_, b_] := If[LessEqual[N[Exp[a], $MachinePrecision], 0.0], N[(b / N[(N[Exp[a], $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision], N[(N[(b * 0.5), $MachinePrecision] + N[(N[(a * N[(0.5 + N[(N[(a * 0.125), $MachinePrecision] + N[(b * -0.25), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[Log[2.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
    
    \begin{array}{l}
    [a, b] = \mathsf{sort}([a, b])\\
    \\
    \begin{array}{l}
    \mathbf{if}\;e^{a} \leq 0:\\
    \;\;\;\;\frac{b}{e^{a} + 1}\\
    
    \mathbf{else}:\\
    \;\;\;\;b \cdot 0.5 + \left(a \cdot \left(0.5 + \left(a \cdot 0.125 + b \cdot -0.25\right)\right) + \log 2\right)\\
    
    
    \end{array}
    \end{array}
    
    Derivation
    1. Split input into 2 regimes
    2. if (exp.f64 a) < 0.0

      1. Initial program 9.9%

        \[\log \left(e^{a} + e^{b}\right) \]
      2. Add Preprocessing
      3. Taylor expanded in b around 0

        \[\leadsto \color{blue}{\log \left(1 + e^{a}\right) + \frac{b}{1 + e^{a}}} \]
      4. Step-by-step derivation
        1. *-rgt-identityN/A

          \[\leadsto \log \left(1 + e^{a}\right) + \frac{b \cdot 1}{\color{blue}{1} + e^{a}} \]
        2. associate-*r/N/A

          \[\leadsto \log \left(1 + e^{a}\right) + b \cdot \color{blue}{\frac{1}{1 + e^{a}}} \]
        3. +-lowering-+.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\log \left(1 + e^{a}\right), \color{blue}{\left(b \cdot \frac{1}{1 + e^{a}}\right)}\right) \]
        4. log1p-defineN/A

          \[\leadsto \mathsf{+.f64}\left(\left(\mathsf{log1p}\left(e^{a}\right)\right), \left(\color{blue}{b} \cdot \frac{1}{1 + e^{a}}\right)\right) \]
        5. log1p-lowering-log1p.f64N/A

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

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(b \cdot \frac{1}{1 + e^{a}}\right)\right) \]
        7. associate-*r/N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b \cdot 1}{\color{blue}{1 + e^{a}}}\right)\right) \]
        8. *-rgt-identityN/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b}{\color{blue}{1} + e^{a}}\right)\right) \]
        9. /-lowering-/.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right)\right) \]
        10. +-lowering-+.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right)\right) \]
        11. exp-lowering-exp.f64100.0%

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right)\right) \]
      5. Simplified100.0%

        \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}} \]
      6. Taylor expanded in b around inf

        \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
      7. Step-by-step derivation
        1. /-lowering-/.f64N/A

          \[\leadsto \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right) \]
        2. +-lowering-+.f64N/A

          \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right) \]
        3. exp-lowering-exp.f64100.0%

          \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right) \]
      8. Simplified100.0%

        \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]

      if 0.0 < (exp.f64 a)

      1. Initial program 66.3%

        \[\log \left(e^{a} + e^{b}\right) \]
      2. Add Preprocessing
      3. Taylor expanded in b around 0

        \[\leadsto \color{blue}{\log \left(1 + e^{a}\right) + \frac{b}{1 + e^{a}}} \]
      4. Step-by-step derivation
        1. *-rgt-identityN/A

          \[\leadsto \log \left(1 + e^{a}\right) + \frac{b \cdot 1}{\color{blue}{1} + e^{a}} \]
        2. associate-*r/N/A

          \[\leadsto \log \left(1 + e^{a}\right) + b \cdot \color{blue}{\frac{1}{1 + e^{a}}} \]
        3. +-lowering-+.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\log \left(1 + e^{a}\right), \color{blue}{\left(b \cdot \frac{1}{1 + e^{a}}\right)}\right) \]
        4. log1p-defineN/A

          \[\leadsto \mathsf{+.f64}\left(\left(\mathsf{log1p}\left(e^{a}\right)\right), \left(\color{blue}{b} \cdot \frac{1}{1 + e^{a}}\right)\right) \]
        5. log1p-lowering-log1p.f64N/A

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

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(b \cdot \frac{1}{1 + e^{a}}\right)\right) \]
        7. associate-*r/N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b \cdot 1}{\color{blue}{1 + e^{a}}}\right)\right) \]
        8. *-rgt-identityN/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b}{\color{blue}{1} + e^{a}}\right)\right) \]
        9. /-lowering-/.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right)\right) \]
        10. +-lowering-+.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right)\right) \]
        11. exp-lowering-exp.f6461.1%

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right)\right) \]
      5. Simplified61.1%

        \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}} \]
      6. Taylor expanded in a around 0

        \[\leadsto \color{blue}{\log 2 + \left(\frac{1}{2} \cdot b + a \cdot \left(\left(\frac{1}{2} + a \cdot \left(\frac{1}{8} - \left(\frac{-1}{8} \cdot b + \frac{1}{8} \cdot b\right)\right)\right) - \frac{1}{4} \cdot b\right)\right)} \]
      7. Step-by-step derivation
        1. +-commutativeN/A

          \[\leadsto \left(\frac{1}{2} \cdot b + a \cdot \left(\left(\frac{1}{2} + a \cdot \left(\frac{1}{8} - \left(\frac{-1}{8} \cdot b + \frac{1}{8} \cdot b\right)\right)\right) - \frac{1}{4} \cdot b\right)\right) + \color{blue}{\log 2} \]
        2. associate-+l+N/A

          \[\leadsto \frac{1}{2} \cdot b + \color{blue}{\left(a \cdot \left(\left(\frac{1}{2} + a \cdot \left(\frac{1}{8} - \left(\frac{-1}{8} \cdot b + \frac{1}{8} \cdot b\right)\right)\right) - \frac{1}{4} \cdot b\right) + \log 2\right)} \]
        3. +-lowering-+.f64N/A

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

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

          \[\leadsto \mathsf{+.f64}\left(\mathsf{*.f64}\left(\frac{1}{2}, b\right), \mathsf{+.f64}\left(\left(a \cdot \left(\left(\frac{1}{2} + a \cdot \left(\frac{1}{8} - \left(\frac{-1}{8} \cdot b + \frac{1}{8} \cdot b\right)\right)\right) - \frac{1}{4} \cdot b\right)\right), \color{blue}{\log 2}\right)\right) \]
      8. Simplified59.5%

        \[\leadsto \color{blue}{0.5 \cdot b + \left(a \cdot \left(0.5 + \left(a \cdot 0.125 + b \cdot -0.25\right)\right) + \log 2\right)} \]
    3. Recombined 2 regimes into one program.
    4. Final simplification69.5%

      \[\leadsto \begin{array}{l} \mathbf{if}\;e^{a} \leq 0:\\ \;\;\;\;\frac{b}{e^{a} + 1}\\ \mathbf{else}:\\ \;\;\;\;b \cdot 0.5 + \left(a \cdot \left(0.5 + \left(a \cdot 0.125 + b \cdot -0.25\right)\right) + \log 2\right)\\ \end{array} \]
    5. Add Preprocessing

    Alternative 7: 97.9% accurate, 1.4× speedup?

    \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;e^{a} \leq 0:\\ \;\;\;\;\frac{b}{e^{a} + 1}\\ \mathbf{else}:\\ \;\;\;\;\log 2 + \left(b \cdot 0.5 + a \cdot \left(0.5 + a \cdot 0.125\right)\right)\\ \end{array} \end{array} \]
    NOTE: a and b should be sorted in increasing order before calling this function.
    (FPCore (a b)
     :precision binary64
     (if (<= (exp a) 0.0)
       (/ b (+ (exp a) 1.0))
       (+ (log 2.0) (+ (* b 0.5) (* a (+ 0.5 (* a 0.125)))))))
    assert(a < b);
    double code(double a, double b) {
    	double tmp;
    	if (exp(a) <= 0.0) {
    		tmp = b / (exp(a) + 1.0);
    	} else {
    		tmp = log(2.0) + ((b * 0.5) + (a * (0.5 + (a * 0.125))));
    	}
    	return tmp;
    }
    
    NOTE: a and b should be sorted in increasing order before calling this function.
    real(8) function code(a, b)
        real(8), intent (in) :: a
        real(8), intent (in) :: b
        real(8) :: tmp
        if (exp(a) <= 0.0d0) then
            tmp = b / (exp(a) + 1.0d0)
        else
            tmp = log(2.0d0) + ((b * 0.5d0) + (a * (0.5d0 + (a * 0.125d0))))
        end if
        code = tmp
    end function
    
    assert a < b;
    public static double code(double a, double b) {
    	double tmp;
    	if (Math.exp(a) <= 0.0) {
    		tmp = b / (Math.exp(a) + 1.0);
    	} else {
    		tmp = Math.log(2.0) + ((b * 0.5) + (a * (0.5 + (a * 0.125))));
    	}
    	return tmp;
    }
    
    [a, b] = sort([a, b])
    def code(a, b):
    	tmp = 0
    	if math.exp(a) <= 0.0:
    		tmp = b / (math.exp(a) + 1.0)
    	else:
    		tmp = math.log(2.0) + ((b * 0.5) + (a * (0.5 + (a * 0.125))))
    	return tmp
    
    a, b = sort([a, b])
    function code(a, b)
    	tmp = 0.0
    	if (exp(a) <= 0.0)
    		tmp = Float64(b / Float64(exp(a) + 1.0));
    	else
    		tmp = Float64(log(2.0) + Float64(Float64(b * 0.5) + Float64(a * Float64(0.5 + Float64(a * 0.125)))));
    	end
    	return tmp
    end
    
    a, b = num2cell(sort([a, b])){:}
    function tmp_2 = code(a, b)
    	tmp = 0.0;
    	if (exp(a) <= 0.0)
    		tmp = b / (exp(a) + 1.0);
    	else
    		tmp = log(2.0) + ((b * 0.5) + (a * (0.5 + (a * 0.125))));
    	end
    	tmp_2 = tmp;
    end
    
    NOTE: a and b should be sorted in increasing order before calling this function.
    code[a_, b_] := If[LessEqual[N[Exp[a], $MachinePrecision], 0.0], N[(b / N[(N[Exp[a], $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision], N[(N[Log[2.0], $MachinePrecision] + N[(N[(b * 0.5), $MachinePrecision] + N[(a * N[(0.5 + N[(a * 0.125), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
    
    \begin{array}{l}
    [a, b] = \mathsf{sort}([a, b])\\
    \\
    \begin{array}{l}
    \mathbf{if}\;e^{a} \leq 0:\\
    \;\;\;\;\frac{b}{e^{a} + 1}\\
    
    \mathbf{else}:\\
    \;\;\;\;\log 2 + \left(b \cdot 0.5 + a \cdot \left(0.5 + a \cdot 0.125\right)\right)\\
    
    
    \end{array}
    \end{array}
    
    Derivation
    1. Split input into 2 regimes
    2. if (exp.f64 a) < 0.0

      1. Initial program 9.9%

        \[\log \left(e^{a} + e^{b}\right) \]
      2. Add Preprocessing
      3. Taylor expanded in b around 0

        \[\leadsto \color{blue}{\log \left(1 + e^{a}\right) + \frac{b}{1 + e^{a}}} \]
      4. Step-by-step derivation
        1. *-rgt-identityN/A

          \[\leadsto \log \left(1 + e^{a}\right) + \frac{b \cdot 1}{\color{blue}{1} + e^{a}} \]
        2. associate-*r/N/A

          \[\leadsto \log \left(1 + e^{a}\right) + b \cdot \color{blue}{\frac{1}{1 + e^{a}}} \]
        3. +-lowering-+.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\log \left(1 + e^{a}\right), \color{blue}{\left(b \cdot \frac{1}{1 + e^{a}}\right)}\right) \]
        4. log1p-defineN/A

          \[\leadsto \mathsf{+.f64}\left(\left(\mathsf{log1p}\left(e^{a}\right)\right), \left(\color{blue}{b} \cdot \frac{1}{1 + e^{a}}\right)\right) \]
        5. log1p-lowering-log1p.f64N/A

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

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(b \cdot \frac{1}{1 + e^{a}}\right)\right) \]
        7. associate-*r/N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b \cdot 1}{\color{blue}{1 + e^{a}}}\right)\right) \]
        8. *-rgt-identityN/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b}{\color{blue}{1} + e^{a}}\right)\right) \]
        9. /-lowering-/.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right)\right) \]
        10. +-lowering-+.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right)\right) \]
        11. exp-lowering-exp.f64100.0%

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right)\right) \]
      5. Simplified100.0%

        \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}} \]
      6. Taylor expanded in b around inf

        \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
      7. Step-by-step derivation
        1. /-lowering-/.f64N/A

          \[\leadsto \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right) \]
        2. +-lowering-+.f64N/A

          \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right) \]
        3. exp-lowering-exp.f64100.0%

          \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right) \]
      8. Simplified100.0%

        \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]

      if 0.0 < (exp.f64 a)

      1. Initial program 66.3%

        \[\log \left(e^{a} + e^{b}\right) \]
      2. Add Preprocessing
      3. Taylor expanded in b around 0

        \[\leadsto \color{blue}{\log \left(1 + e^{a}\right) + \frac{b}{1 + e^{a}}} \]
      4. Step-by-step derivation
        1. *-rgt-identityN/A

          \[\leadsto \log \left(1 + e^{a}\right) + \frac{b \cdot 1}{\color{blue}{1} + e^{a}} \]
        2. associate-*r/N/A

          \[\leadsto \log \left(1 + e^{a}\right) + b \cdot \color{blue}{\frac{1}{1 + e^{a}}} \]
        3. +-lowering-+.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\log \left(1 + e^{a}\right), \color{blue}{\left(b \cdot \frac{1}{1 + e^{a}}\right)}\right) \]
        4. log1p-defineN/A

          \[\leadsto \mathsf{+.f64}\left(\left(\mathsf{log1p}\left(e^{a}\right)\right), \left(\color{blue}{b} \cdot \frac{1}{1 + e^{a}}\right)\right) \]
        5. log1p-lowering-log1p.f64N/A

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

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(b \cdot \frac{1}{1 + e^{a}}\right)\right) \]
        7. associate-*r/N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b \cdot 1}{\color{blue}{1 + e^{a}}}\right)\right) \]
        8. *-rgt-identityN/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b}{\color{blue}{1} + e^{a}}\right)\right) \]
        9. /-lowering-/.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right)\right) \]
        10. +-lowering-+.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right)\right) \]
        11. exp-lowering-exp.f6461.1%

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right)\right) \]
      5. Simplified61.1%

        \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}} \]
      6. Step-by-step derivation
        1. clear-numN/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{1}{\color{blue}{\frac{1 + e^{a}}{b}}}\right)\right) \]
        2. /-lowering-/.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(1, \color{blue}{\left(\frac{1 + e^{a}}{b}\right)}\right)\right) \]
        3. /-lowering-/.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(1, \mathsf{/.f64}\left(\left(1 + e^{a}\right), \color{blue}{b}\right)\right)\right) \]
        4. +-lowering-+.f64N/A

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(1, \mathsf{/.f64}\left(\mathsf{+.f64}\left(1, \left(e^{a}\right)\right), b\right)\right)\right) \]
        5. exp-lowering-exp.f6461.1%

          \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(1, \mathsf{/.f64}\left(\mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right), b\right)\right)\right) \]
      7. Applied egg-rr61.1%

        \[\leadsto \mathsf{log1p}\left(e^{a}\right) + \color{blue}{\frac{1}{\frac{1 + e^{a}}{b}}} \]
      8. Taylor expanded in a around 0

        \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(1, \mathsf{/.f64}\left(\color{blue}{2}, b\right)\right)\right) \]
      9. Step-by-step derivation
        1. Simplified61.1%

          \[\leadsto \mathsf{log1p}\left(e^{a}\right) + \frac{1}{\frac{\color{blue}{2}}{b}} \]
        2. Taylor expanded in a around 0

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

            \[\leadsto \mathsf{+.f64}\left(\log 2, \color{blue}{\left(\frac{1}{2} \cdot b + a \cdot \left(\frac{1}{2} + \frac{1}{8} \cdot a\right)\right)}\right) \]
          2. log-lowering-log.f64N/A

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

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \mathsf{+.f64}\left(\left(\frac{1}{2} \cdot b\right), \color{blue}{\left(a \cdot \left(\frac{1}{2} + \frac{1}{8} \cdot a\right)\right)}\right)\right) \]
          4. *-commutativeN/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \mathsf{+.f64}\left(\left(b \cdot \frac{1}{2}\right), \left(\color{blue}{a} \cdot \left(\frac{1}{2} + \frac{1}{8} \cdot a\right)\right)\right)\right) \]
          5. *-lowering-*.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \mathsf{+.f64}\left(\mathsf{*.f64}\left(b, \frac{1}{2}\right), \left(\color{blue}{a} \cdot \left(\frac{1}{2} + \frac{1}{8} \cdot a\right)\right)\right)\right) \]
          6. *-lowering-*.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \mathsf{+.f64}\left(\mathsf{*.f64}\left(b, \frac{1}{2}\right), \mathsf{*.f64}\left(a, \color{blue}{\left(\frac{1}{2} + \frac{1}{8} \cdot a\right)}\right)\right)\right) \]
          7. +-lowering-+.f64N/A

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

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \mathsf{+.f64}\left(\mathsf{*.f64}\left(b, \frac{1}{2}\right), \mathsf{*.f64}\left(a, \mathsf{+.f64}\left(\frac{1}{2}, \left(a \cdot \color{blue}{\frac{1}{8}}\right)\right)\right)\right)\right) \]
          9. *-lowering-*.f6459.4%

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \mathsf{+.f64}\left(\mathsf{*.f64}\left(b, \frac{1}{2}\right), \mathsf{*.f64}\left(a, \mathsf{+.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(a, \color{blue}{\frac{1}{8}}\right)\right)\right)\right)\right) \]
        4. Simplified59.4%

          \[\leadsto \color{blue}{\log 2 + \left(b \cdot 0.5 + a \cdot \left(0.5 + a \cdot 0.125\right)\right)} \]
      10. Recombined 2 regimes into one program.
      11. Final simplification69.4%

        \[\leadsto \begin{array}{l} \mathbf{if}\;e^{a} \leq 0:\\ \;\;\;\;\frac{b}{e^{a} + 1}\\ \mathbf{else}:\\ \;\;\;\;\log 2 + \left(b \cdot 0.5 + a \cdot \left(0.5 + a \cdot 0.125\right)\right)\\ \end{array} \]
      12. Add Preprocessing

      Alternative 8: 97.7% accurate, 1.4× speedup?

      \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;e^{a} \leq 0:\\ \;\;\;\;\frac{b}{e^{a} + 1}\\ \mathbf{else}:\\ \;\;\;\;\log \left(2 + \left(b + a \cdot \left(1 + a \cdot 0.5\right)\right)\right)\\ \end{array} \end{array} \]
      NOTE: a and b should be sorted in increasing order before calling this function.
      (FPCore (a b)
       :precision binary64
       (if (<= (exp a) 0.0)
         (/ b (+ (exp a) 1.0))
         (log (+ 2.0 (+ b (* a (+ 1.0 (* a 0.5))))))))
      assert(a < b);
      double code(double a, double b) {
      	double tmp;
      	if (exp(a) <= 0.0) {
      		tmp = b / (exp(a) + 1.0);
      	} else {
      		tmp = log((2.0 + (b + (a * (1.0 + (a * 0.5))))));
      	}
      	return tmp;
      }
      
      NOTE: a and b should be sorted in increasing order before calling this function.
      real(8) function code(a, b)
          real(8), intent (in) :: a
          real(8), intent (in) :: b
          real(8) :: tmp
          if (exp(a) <= 0.0d0) then
              tmp = b / (exp(a) + 1.0d0)
          else
              tmp = log((2.0d0 + (b + (a * (1.0d0 + (a * 0.5d0))))))
          end if
          code = tmp
      end function
      
      assert a < b;
      public static double code(double a, double b) {
      	double tmp;
      	if (Math.exp(a) <= 0.0) {
      		tmp = b / (Math.exp(a) + 1.0);
      	} else {
      		tmp = Math.log((2.0 + (b + (a * (1.0 + (a * 0.5))))));
      	}
      	return tmp;
      }
      
      [a, b] = sort([a, b])
      def code(a, b):
      	tmp = 0
      	if math.exp(a) <= 0.0:
      		tmp = b / (math.exp(a) + 1.0)
      	else:
      		tmp = math.log((2.0 + (b + (a * (1.0 + (a * 0.5))))))
      	return tmp
      
      a, b = sort([a, b])
      function code(a, b)
      	tmp = 0.0
      	if (exp(a) <= 0.0)
      		tmp = Float64(b / Float64(exp(a) + 1.0));
      	else
      		tmp = log(Float64(2.0 + Float64(b + Float64(a * Float64(1.0 + Float64(a * 0.5))))));
      	end
      	return tmp
      end
      
      a, b = num2cell(sort([a, b])){:}
      function tmp_2 = code(a, b)
      	tmp = 0.0;
      	if (exp(a) <= 0.0)
      		tmp = b / (exp(a) + 1.0);
      	else
      		tmp = log((2.0 + (b + (a * (1.0 + (a * 0.5))))));
      	end
      	tmp_2 = tmp;
      end
      
      NOTE: a and b should be sorted in increasing order before calling this function.
      code[a_, b_] := If[LessEqual[N[Exp[a], $MachinePrecision], 0.0], N[(b / N[(N[Exp[a], $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision], N[Log[N[(2.0 + N[(b + N[(a * N[(1.0 + N[(a * 0.5), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]]
      
      \begin{array}{l}
      [a, b] = \mathsf{sort}([a, b])\\
      \\
      \begin{array}{l}
      \mathbf{if}\;e^{a} \leq 0:\\
      \;\;\;\;\frac{b}{e^{a} + 1}\\
      
      \mathbf{else}:\\
      \;\;\;\;\log \left(2 + \left(b + a \cdot \left(1 + a \cdot 0.5\right)\right)\right)\\
      
      
      \end{array}
      \end{array}
      
      Derivation
      1. Split input into 2 regimes
      2. if (exp.f64 a) < 0.0

        1. Initial program 9.9%

          \[\log \left(e^{a} + e^{b}\right) \]
        2. Add Preprocessing
        3. Taylor expanded in b around 0

          \[\leadsto \color{blue}{\log \left(1 + e^{a}\right) + \frac{b}{1 + e^{a}}} \]
        4. Step-by-step derivation
          1. *-rgt-identityN/A

            \[\leadsto \log \left(1 + e^{a}\right) + \frac{b \cdot 1}{\color{blue}{1} + e^{a}} \]
          2. associate-*r/N/A

            \[\leadsto \log \left(1 + e^{a}\right) + b \cdot \color{blue}{\frac{1}{1 + e^{a}}} \]
          3. +-lowering-+.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\log \left(1 + e^{a}\right), \color{blue}{\left(b \cdot \frac{1}{1 + e^{a}}\right)}\right) \]
          4. log1p-defineN/A

            \[\leadsto \mathsf{+.f64}\left(\left(\mathsf{log1p}\left(e^{a}\right)\right), \left(\color{blue}{b} \cdot \frac{1}{1 + e^{a}}\right)\right) \]
          5. log1p-lowering-log1p.f64N/A

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

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(b \cdot \frac{1}{1 + e^{a}}\right)\right) \]
          7. associate-*r/N/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b \cdot 1}{\color{blue}{1 + e^{a}}}\right)\right) \]
          8. *-rgt-identityN/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b}{\color{blue}{1} + e^{a}}\right)\right) \]
          9. /-lowering-/.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right)\right) \]
          10. +-lowering-+.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right)\right) \]
          11. exp-lowering-exp.f64100.0%

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right)\right) \]
        5. Simplified100.0%

          \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}} \]
        6. Taylor expanded in b around inf

          \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
        7. Step-by-step derivation
          1. /-lowering-/.f64N/A

            \[\leadsto \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right) \]
          2. +-lowering-+.f64N/A

            \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right) \]
          3. exp-lowering-exp.f64100.0%

            \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right) \]
        8. Simplified100.0%

          \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]

        if 0.0 < (exp.f64 a)

        1. Initial program 66.3%

          \[\log \left(e^{a} + e^{b}\right) \]
        2. Add Preprocessing
        3. Taylor expanded in b around 0

          \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \color{blue}{\left(1 + b \cdot \left(1 + \frac{1}{2} \cdot b\right)\right)}\right)\right) \]
        4. Step-by-step derivation
          1. +-lowering-+.f64N/A

            \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \left(b \cdot \left(1 + \frac{1}{2} \cdot b\right)\right)\right)\right)\right) \]
          2. *-lowering-*.f64N/A

            \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \left(1 + \frac{1}{2} \cdot b\right)\right)\right)\right)\right) \]
          3. +-lowering-+.f64N/A

            \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \mathsf{+.f64}\left(1, \left(\frac{1}{2} \cdot b\right)\right)\right)\right)\right)\right) \]
          4. *-commutativeN/A

            \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \mathsf{+.f64}\left(1, \left(b \cdot \frac{1}{2}\right)\right)\right)\right)\right)\right) \]
          5. *-lowering-*.f6460.0%

            \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \frac{1}{2}\right)\right)\right)\right)\right)\right) \]
        5. Simplified60.0%

          \[\leadsto \log \left(e^{a} + \color{blue}{\left(1 + b \cdot \left(1 + b \cdot 0.5\right)\right)}\right) \]
        6. Taylor expanded in b around 0

          \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \color{blue}{\left(1 + b\right)}\right)\right) \]
        7. Step-by-step derivation
          1. +-commutativeN/A

            \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \left(b + 1\right)\right)\right) \]
          2. +-lowering-+.f6458.6%

            \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(b, 1\right)\right)\right) \]
        8. Simplified58.6%

          \[\leadsto \log \left(e^{a} + \color{blue}{\left(b + 1\right)}\right) \]
        9. Taylor expanded in a around 0

          \[\leadsto \mathsf{log.f64}\left(\color{blue}{\left(2 + \left(b + a \cdot \left(1 + \frac{1}{2} \cdot a\right)\right)\right)}\right) \]
        10. Step-by-step derivation
          1. +-lowering-+.f64N/A

            \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(2, \left(b + a \cdot \left(1 + \frac{1}{2} \cdot a\right)\right)\right)\right) \]
          2. +-lowering-+.f64N/A

            \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(2, \mathsf{+.f64}\left(b, \left(a \cdot \left(1 + \frac{1}{2} \cdot a\right)\right)\right)\right)\right) \]
          3. *-lowering-*.f64N/A

            \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(2, \mathsf{+.f64}\left(b, \mathsf{*.f64}\left(a, \left(1 + \frac{1}{2} \cdot a\right)\right)\right)\right)\right) \]
          4. +-lowering-+.f64N/A

            \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(2, \mathsf{+.f64}\left(b, \mathsf{*.f64}\left(a, \mathsf{+.f64}\left(1, \left(\frac{1}{2} \cdot a\right)\right)\right)\right)\right)\right) \]
          5. *-lowering-*.f6458.2%

            \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(2, \mathsf{+.f64}\left(b, \mathsf{*.f64}\left(a, \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(\frac{1}{2}, a\right)\right)\right)\right)\right)\right) \]
        11. Simplified58.2%

          \[\leadsto \log \color{blue}{\left(2 + \left(b + a \cdot \left(1 + 0.5 \cdot a\right)\right)\right)} \]
      3. Recombined 2 regimes into one program.
      4. Final simplification68.5%

        \[\leadsto \begin{array}{l} \mathbf{if}\;e^{a} \leq 0:\\ \;\;\;\;\frac{b}{e^{a} + 1}\\ \mathbf{else}:\\ \;\;\;\;\log \left(2 + \left(b + a \cdot \left(1 + a \cdot 0.5\right)\right)\right)\\ \end{array} \]
      5. Add Preprocessing

      Alternative 9: 97.3% accurate, 1.4× speedup?

      \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;e^{a} \leq 0:\\ \;\;\;\;\frac{b}{e^{a} + 1}\\ \mathbf{else}:\\ \;\;\;\;\log 2 + a \cdot \left(0.5 + a \cdot 0.125\right)\\ \end{array} \end{array} \]
      NOTE: a and b should be sorted in increasing order before calling this function.
      (FPCore (a b)
       :precision binary64
       (if (<= (exp a) 0.0)
         (/ b (+ (exp a) 1.0))
         (+ (log 2.0) (* a (+ 0.5 (* a 0.125))))))
      assert(a < b);
      double code(double a, double b) {
      	double tmp;
      	if (exp(a) <= 0.0) {
      		tmp = b / (exp(a) + 1.0);
      	} else {
      		tmp = log(2.0) + (a * (0.5 + (a * 0.125)));
      	}
      	return tmp;
      }
      
      NOTE: a and b should be sorted in increasing order before calling this function.
      real(8) function code(a, b)
          real(8), intent (in) :: a
          real(8), intent (in) :: b
          real(8) :: tmp
          if (exp(a) <= 0.0d0) then
              tmp = b / (exp(a) + 1.0d0)
          else
              tmp = log(2.0d0) + (a * (0.5d0 + (a * 0.125d0)))
          end if
          code = tmp
      end function
      
      assert a < b;
      public static double code(double a, double b) {
      	double tmp;
      	if (Math.exp(a) <= 0.0) {
      		tmp = b / (Math.exp(a) + 1.0);
      	} else {
      		tmp = Math.log(2.0) + (a * (0.5 + (a * 0.125)));
      	}
      	return tmp;
      }
      
      [a, b] = sort([a, b])
      def code(a, b):
      	tmp = 0
      	if math.exp(a) <= 0.0:
      		tmp = b / (math.exp(a) + 1.0)
      	else:
      		tmp = math.log(2.0) + (a * (0.5 + (a * 0.125)))
      	return tmp
      
      a, b = sort([a, b])
      function code(a, b)
      	tmp = 0.0
      	if (exp(a) <= 0.0)
      		tmp = Float64(b / Float64(exp(a) + 1.0));
      	else
      		tmp = Float64(log(2.0) + Float64(a * Float64(0.5 + Float64(a * 0.125))));
      	end
      	return tmp
      end
      
      a, b = num2cell(sort([a, b])){:}
      function tmp_2 = code(a, b)
      	tmp = 0.0;
      	if (exp(a) <= 0.0)
      		tmp = b / (exp(a) + 1.0);
      	else
      		tmp = log(2.0) + (a * (0.5 + (a * 0.125)));
      	end
      	tmp_2 = tmp;
      end
      
      NOTE: a and b should be sorted in increasing order before calling this function.
      code[a_, b_] := If[LessEqual[N[Exp[a], $MachinePrecision], 0.0], N[(b / N[(N[Exp[a], $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision], N[(N[Log[2.0], $MachinePrecision] + N[(a * N[(0.5 + N[(a * 0.125), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
      
      \begin{array}{l}
      [a, b] = \mathsf{sort}([a, b])\\
      \\
      \begin{array}{l}
      \mathbf{if}\;e^{a} \leq 0:\\
      \;\;\;\;\frac{b}{e^{a} + 1}\\
      
      \mathbf{else}:\\
      \;\;\;\;\log 2 + a \cdot \left(0.5 + a \cdot 0.125\right)\\
      
      
      \end{array}
      \end{array}
      
      Derivation
      1. Split input into 2 regimes
      2. if (exp.f64 a) < 0.0

        1. Initial program 9.9%

          \[\log \left(e^{a} + e^{b}\right) \]
        2. Add Preprocessing
        3. Taylor expanded in b around 0

          \[\leadsto \color{blue}{\log \left(1 + e^{a}\right) + \frac{b}{1 + e^{a}}} \]
        4. Step-by-step derivation
          1. *-rgt-identityN/A

            \[\leadsto \log \left(1 + e^{a}\right) + \frac{b \cdot 1}{\color{blue}{1} + e^{a}} \]
          2. associate-*r/N/A

            \[\leadsto \log \left(1 + e^{a}\right) + b \cdot \color{blue}{\frac{1}{1 + e^{a}}} \]
          3. +-lowering-+.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\log \left(1 + e^{a}\right), \color{blue}{\left(b \cdot \frac{1}{1 + e^{a}}\right)}\right) \]
          4. log1p-defineN/A

            \[\leadsto \mathsf{+.f64}\left(\left(\mathsf{log1p}\left(e^{a}\right)\right), \left(\color{blue}{b} \cdot \frac{1}{1 + e^{a}}\right)\right) \]
          5. log1p-lowering-log1p.f64N/A

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

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(b \cdot \frac{1}{1 + e^{a}}\right)\right) \]
          7. associate-*r/N/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b \cdot 1}{\color{blue}{1 + e^{a}}}\right)\right) \]
          8. *-rgt-identityN/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b}{\color{blue}{1} + e^{a}}\right)\right) \]
          9. /-lowering-/.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right)\right) \]
          10. +-lowering-+.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right)\right) \]
          11. exp-lowering-exp.f64100.0%

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right)\right) \]
        5. Simplified100.0%

          \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}} \]
        6. Taylor expanded in b around inf

          \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
        7. Step-by-step derivation
          1. /-lowering-/.f64N/A

            \[\leadsto \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right) \]
          2. +-lowering-+.f64N/A

            \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right) \]
          3. exp-lowering-exp.f64100.0%

            \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right) \]
        8. Simplified100.0%

          \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]

        if 0.0 < (exp.f64 a)

        1. Initial program 66.3%

          \[\log \left(e^{a} + e^{b}\right) \]
        2. Add Preprocessing
        3. Taylor expanded in b around 0

          \[\leadsto \color{blue}{\log \left(1 + e^{a}\right)} \]
        4. Step-by-step derivation
          1. log1p-defineN/A

            \[\leadsto \mathsf{log1p}\left(e^{a}\right) \]
          2. log1p-lowering-log1p.f64N/A

            \[\leadsto \mathsf{log1p.f64}\left(\left(e^{a}\right)\right) \]
          3. exp-lowering-exp.f6461.4%

            \[\leadsto \mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right) \]
        5. Simplified61.4%

          \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right)} \]
        6. Taylor expanded in a around 0

          \[\leadsto \color{blue}{\log 2 + a \cdot \left(\frac{1}{2} + \frac{1}{8} \cdot a\right)} \]
        7. Step-by-step derivation
          1. +-lowering-+.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\log 2, \color{blue}{\left(a \cdot \left(\frac{1}{2} + \frac{1}{8} \cdot a\right)\right)}\right) \]
          2. log-lowering-log.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \left(\color{blue}{a} \cdot \left(\frac{1}{2} + \frac{1}{8} \cdot a\right)\right)\right) \]
          3. metadata-evalN/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \left(a \cdot \left(\frac{1}{2} + \left(\frac{1}{8} - 0\right) \cdot a\right)\right)\right) \]
          4. mul0-rgtN/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \left(a \cdot \left(\frac{1}{2} + \left(\frac{1}{8} - b \cdot 0\right) \cdot a\right)\right)\right) \]
          5. metadata-evalN/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \left(a \cdot \left(\frac{1}{2} + \left(\frac{1}{8} - b \cdot \left(\frac{-1}{8} + \frac{1}{8}\right)\right) \cdot a\right)\right)\right) \]
          6. distribute-rgt-outN/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \left(a \cdot \left(\frac{1}{2} + \left(\frac{1}{8} - \left(\frac{-1}{8} \cdot b + \frac{1}{8} \cdot b\right)\right) \cdot a\right)\right)\right) \]
          7. *-commutativeN/A

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

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \mathsf{*.f64}\left(a, \color{blue}{\left(\frac{1}{2} + a \cdot \left(\frac{1}{8} - \left(\frac{-1}{8} \cdot b + \frac{1}{8} \cdot b\right)\right)\right)}\right)\right) \]
          9. *-commutativeN/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \mathsf{*.f64}\left(a, \left(\frac{1}{2} + \left(\frac{1}{8} - \left(\frac{-1}{8} \cdot b + \frac{1}{8} \cdot b\right)\right) \cdot \color{blue}{a}\right)\right)\right) \]
          10. distribute-rgt-outN/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \mathsf{*.f64}\left(a, \left(\frac{1}{2} + \left(\frac{1}{8} - b \cdot \left(\frac{-1}{8} + \frac{1}{8}\right)\right) \cdot a\right)\right)\right) \]
          11. metadata-evalN/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \mathsf{*.f64}\left(a, \left(\frac{1}{2} + \left(\frac{1}{8} - b \cdot 0\right) \cdot a\right)\right)\right) \]
          12. mul0-rgtN/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \mathsf{*.f64}\left(a, \left(\frac{1}{2} + \left(\frac{1}{8} - 0\right) \cdot a\right)\right)\right) \]
          13. metadata-evalN/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \mathsf{*.f64}\left(a, \left(\frac{1}{2} + \frac{1}{8} \cdot a\right)\right)\right) \]
          14. +-lowering-+.f64N/A

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

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \mathsf{*.f64}\left(a, \mathsf{+.f64}\left(\frac{1}{2}, \left(a \cdot \color{blue}{\frac{1}{8}}\right)\right)\right)\right) \]
          16. *-lowering-*.f6459.4%

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \mathsf{*.f64}\left(a, \mathsf{+.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(a, \color{blue}{\frac{1}{8}}\right)\right)\right)\right) \]
        8. Simplified59.4%

          \[\leadsto \color{blue}{\log 2 + a \cdot \left(0.5 + a \cdot 0.125\right)} \]
      3. Recombined 2 regimes into one program.
      4. Final simplification69.4%

        \[\leadsto \begin{array}{l} \mathbf{if}\;e^{a} \leq 0:\\ \;\;\;\;\frac{b}{e^{a} + 1}\\ \mathbf{else}:\\ \;\;\;\;\log 2 + a \cdot \left(0.5 + a \cdot 0.125\right)\\ \end{array} \]
      5. Add Preprocessing

      Alternative 10: 97.1% accurate, 1.4× speedup?

      \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;e^{a} \leq 0:\\ \;\;\;\;\frac{b}{e^{a} + 1}\\ \mathbf{else}:\\ \;\;\;\;b \cdot 0.5 + \log 2\\ \end{array} \end{array} \]
      NOTE: a and b should be sorted in increasing order before calling this function.
      (FPCore (a b)
       :precision binary64
       (if (<= (exp a) 0.0) (/ b (+ (exp a) 1.0)) (+ (* b 0.5) (log 2.0))))
      assert(a < b);
      double code(double a, double b) {
      	double tmp;
      	if (exp(a) <= 0.0) {
      		tmp = b / (exp(a) + 1.0);
      	} else {
      		tmp = (b * 0.5) + log(2.0);
      	}
      	return tmp;
      }
      
      NOTE: a and b should be sorted in increasing order before calling this function.
      real(8) function code(a, b)
          real(8), intent (in) :: a
          real(8), intent (in) :: b
          real(8) :: tmp
          if (exp(a) <= 0.0d0) then
              tmp = b / (exp(a) + 1.0d0)
          else
              tmp = (b * 0.5d0) + log(2.0d0)
          end if
          code = tmp
      end function
      
      assert a < b;
      public static double code(double a, double b) {
      	double tmp;
      	if (Math.exp(a) <= 0.0) {
      		tmp = b / (Math.exp(a) + 1.0);
      	} else {
      		tmp = (b * 0.5) + Math.log(2.0);
      	}
      	return tmp;
      }
      
      [a, b] = sort([a, b])
      def code(a, b):
      	tmp = 0
      	if math.exp(a) <= 0.0:
      		tmp = b / (math.exp(a) + 1.0)
      	else:
      		tmp = (b * 0.5) + math.log(2.0)
      	return tmp
      
      a, b = sort([a, b])
      function code(a, b)
      	tmp = 0.0
      	if (exp(a) <= 0.0)
      		tmp = Float64(b / Float64(exp(a) + 1.0));
      	else
      		tmp = Float64(Float64(b * 0.5) + log(2.0));
      	end
      	return tmp
      end
      
      a, b = num2cell(sort([a, b])){:}
      function tmp_2 = code(a, b)
      	tmp = 0.0;
      	if (exp(a) <= 0.0)
      		tmp = b / (exp(a) + 1.0);
      	else
      		tmp = (b * 0.5) + log(2.0);
      	end
      	tmp_2 = tmp;
      end
      
      NOTE: a and b should be sorted in increasing order before calling this function.
      code[a_, b_] := If[LessEqual[N[Exp[a], $MachinePrecision], 0.0], N[(b / N[(N[Exp[a], $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision], N[(N[(b * 0.5), $MachinePrecision] + N[Log[2.0], $MachinePrecision]), $MachinePrecision]]
      
      \begin{array}{l}
      [a, b] = \mathsf{sort}([a, b])\\
      \\
      \begin{array}{l}
      \mathbf{if}\;e^{a} \leq 0:\\
      \;\;\;\;\frac{b}{e^{a} + 1}\\
      
      \mathbf{else}:\\
      \;\;\;\;b \cdot 0.5 + \log 2\\
      
      
      \end{array}
      \end{array}
      
      Derivation
      1. Split input into 2 regimes
      2. if (exp.f64 a) < 0.0

        1. Initial program 9.9%

          \[\log \left(e^{a} + e^{b}\right) \]
        2. Add Preprocessing
        3. Taylor expanded in b around 0

          \[\leadsto \color{blue}{\log \left(1 + e^{a}\right) + \frac{b}{1 + e^{a}}} \]
        4. Step-by-step derivation
          1. *-rgt-identityN/A

            \[\leadsto \log \left(1 + e^{a}\right) + \frac{b \cdot 1}{\color{blue}{1} + e^{a}} \]
          2. associate-*r/N/A

            \[\leadsto \log \left(1 + e^{a}\right) + b \cdot \color{blue}{\frac{1}{1 + e^{a}}} \]
          3. +-lowering-+.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\log \left(1 + e^{a}\right), \color{blue}{\left(b \cdot \frac{1}{1 + e^{a}}\right)}\right) \]
          4. log1p-defineN/A

            \[\leadsto \mathsf{+.f64}\left(\left(\mathsf{log1p}\left(e^{a}\right)\right), \left(\color{blue}{b} \cdot \frac{1}{1 + e^{a}}\right)\right) \]
          5. log1p-lowering-log1p.f64N/A

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

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(b \cdot \frac{1}{1 + e^{a}}\right)\right) \]
          7. associate-*r/N/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b \cdot 1}{\color{blue}{1 + e^{a}}}\right)\right) \]
          8. *-rgt-identityN/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b}{\color{blue}{1} + e^{a}}\right)\right) \]
          9. /-lowering-/.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right)\right) \]
          10. +-lowering-+.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right)\right) \]
          11. exp-lowering-exp.f64100.0%

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right)\right) \]
        5. Simplified100.0%

          \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}} \]
        6. Taylor expanded in b around inf

          \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
        7. Step-by-step derivation
          1. /-lowering-/.f64N/A

            \[\leadsto \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right) \]
          2. +-lowering-+.f64N/A

            \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right) \]
          3. exp-lowering-exp.f64100.0%

            \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right) \]
        8. Simplified100.0%

          \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]

        if 0.0 < (exp.f64 a)

        1. Initial program 66.3%

          \[\log \left(e^{a} + e^{b}\right) \]
        2. Add Preprocessing
        3. Taylor expanded in b around 0

          \[\leadsto \color{blue}{\log \left(1 + e^{a}\right) + \frac{b}{1 + e^{a}}} \]
        4. Step-by-step derivation
          1. *-rgt-identityN/A

            \[\leadsto \log \left(1 + e^{a}\right) + \frac{b \cdot 1}{\color{blue}{1} + e^{a}} \]
          2. associate-*r/N/A

            \[\leadsto \log \left(1 + e^{a}\right) + b \cdot \color{blue}{\frac{1}{1 + e^{a}}} \]
          3. +-lowering-+.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\log \left(1 + e^{a}\right), \color{blue}{\left(b \cdot \frac{1}{1 + e^{a}}\right)}\right) \]
          4. log1p-defineN/A

            \[\leadsto \mathsf{+.f64}\left(\left(\mathsf{log1p}\left(e^{a}\right)\right), \left(\color{blue}{b} \cdot \frac{1}{1 + e^{a}}\right)\right) \]
          5. log1p-lowering-log1p.f64N/A

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

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(b \cdot \frac{1}{1 + e^{a}}\right)\right) \]
          7. associate-*r/N/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b \cdot 1}{\color{blue}{1 + e^{a}}}\right)\right) \]
          8. *-rgt-identityN/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b}{\color{blue}{1} + e^{a}}\right)\right) \]
          9. /-lowering-/.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right)\right) \]
          10. +-lowering-+.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right)\right) \]
          11. exp-lowering-exp.f6461.1%

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right)\right) \]
        5. Simplified61.1%

          \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}} \]
        6. Taylor expanded in a around 0

          \[\leadsto \color{blue}{\log 2 + \frac{1}{2} \cdot b} \]
        7. Step-by-step derivation
          1. +-lowering-+.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\log 2, \color{blue}{\left(\frac{1}{2} \cdot b\right)}\right) \]
          2. log-lowering-log.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \left(\color{blue}{\frac{1}{2}} \cdot b\right)\right) \]
          3. *-lowering-*.f6458.7%

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \mathsf{*.f64}\left(\frac{1}{2}, \color{blue}{b}\right)\right) \]
        8. Simplified58.7%

          \[\leadsto \color{blue}{\log 2 + 0.5 \cdot b} \]
      3. Recombined 2 regimes into one program.
      4. Final simplification68.9%

        \[\leadsto \begin{array}{l} \mathbf{if}\;e^{a} \leq 0:\\ \;\;\;\;\frac{b}{e^{a} + 1}\\ \mathbf{else}:\\ \;\;\;\;b \cdot 0.5 + \log 2\\ \end{array} \]
      5. Add Preprocessing

      Alternative 11: 56.7% accurate, 2.8× speedup?

      \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;a \leq -160:\\ \;\;\;\;\frac{b}{2}\\ \mathbf{else}:\\ \;\;\;\;b \cdot 0.5 + \log 2\\ \end{array} \end{array} \]
      NOTE: a and b should be sorted in increasing order before calling this function.
      (FPCore (a b)
       :precision binary64
       (if (<= a -160.0) (/ b 2.0) (+ (* b 0.5) (log 2.0))))
      assert(a < b);
      double code(double a, double b) {
      	double tmp;
      	if (a <= -160.0) {
      		tmp = b / 2.0;
      	} else {
      		tmp = (b * 0.5) + log(2.0);
      	}
      	return tmp;
      }
      
      NOTE: a and b should be sorted in increasing order before calling this function.
      real(8) function code(a, b)
          real(8), intent (in) :: a
          real(8), intent (in) :: b
          real(8) :: tmp
          if (a <= (-160.0d0)) then
              tmp = b / 2.0d0
          else
              tmp = (b * 0.5d0) + log(2.0d0)
          end if
          code = tmp
      end function
      
      assert a < b;
      public static double code(double a, double b) {
      	double tmp;
      	if (a <= -160.0) {
      		tmp = b / 2.0;
      	} else {
      		tmp = (b * 0.5) + Math.log(2.0);
      	}
      	return tmp;
      }
      
      [a, b] = sort([a, b])
      def code(a, b):
      	tmp = 0
      	if a <= -160.0:
      		tmp = b / 2.0
      	else:
      		tmp = (b * 0.5) + math.log(2.0)
      	return tmp
      
      a, b = sort([a, b])
      function code(a, b)
      	tmp = 0.0
      	if (a <= -160.0)
      		tmp = Float64(b / 2.0);
      	else
      		tmp = Float64(Float64(b * 0.5) + log(2.0));
      	end
      	return tmp
      end
      
      a, b = num2cell(sort([a, b])){:}
      function tmp_2 = code(a, b)
      	tmp = 0.0;
      	if (a <= -160.0)
      		tmp = b / 2.0;
      	else
      		tmp = (b * 0.5) + log(2.0);
      	end
      	tmp_2 = tmp;
      end
      
      NOTE: a and b should be sorted in increasing order before calling this function.
      code[a_, b_] := If[LessEqual[a, -160.0], N[(b / 2.0), $MachinePrecision], N[(N[(b * 0.5), $MachinePrecision] + N[Log[2.0], $MachinePrecision]), $MachinePrecision]]
      
      \begin{array}{l}
      [a, b] = \mathsf{sort}([a, b])\\
      \\
      \begin{array}{l}
      \mathbf{if}\;a \leq -160:\\
      \;\;\;\;\frac{b}{2}\\
      
      \mathbf{else}:\\
      \;\;\;\;b \cdot 0.5 + \log 2\\
      
      
      \end{array}
      \end{array}
      
      Derivation
      1. Split input into 2 regimes
      2. if a < -160

        1. Initial program 9.9%

          \[\log \left(e^{a} + e^{b}\right) \]
        2. Add Preprocessing
        3. Taylor expanded in b around 0

          \[\leadsto \color{blue}{\log \left(1 + e^{a}\right) + \frac{b}{1 + e^{a}}} \]
        4. Step-by-step derivation
          1. *-rgt-identityN/A

            \[\leadsto \log \left(1 + e^{a}\right) + \frac{b \cdot 1}{\color{blue}{1} + e^{a}} \]
          2. associate-*r/N/A

            \[\leadsto \log \left(1 + e^{a}\right) + b \cdot \color{blue}{\frac{1}{1 + e^{a}}} \]
          3. +-lowering-+.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\log \left(1 + e^{a}\right), \color{blue}{\left(b \cdot \frac{1}{1 + e^{a}}\right)}\right) \]
          4. log1p-defineN/A

            \[\leadsto \mathsf{+.f64}\left(\left(\mathsf{log1p}\left(e^{a}\right)\right), \left(\color{blue}{b} \cdot \frac{1}{1 + e^{a}}\right)\right) \]
          5. log1p-lowering-log1p.f64N/A

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

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(b \cdot \frac{1}{1 + e^{a}}\right)\right) \]
          7. associate-*r/N/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b \cdot 1}{\color{blue}{1 + e^{a}}}\right)\right) \]
          8. *-rgt-identityN/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b}{\color{blue}{1} + e^{a}}\right)\right) \]
          9. /-lowering-/.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right)\right) \]
          10. +-lowering-+.f64N/A

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right)\right) \]
          11. exp-lowering-exp.f64100.0%

            \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right)\right) \]
        5. Simplified100.0%

          \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}} \]
        6. Taylor expanded in b around inf

          \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
        7. Step-by-step derivation
          1. /-lowering-/.f64N/A

            \[\leadsto \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right) \]
          2. +-lowering-+.f64N/A

            \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right) \]
          3. exp-lowering-exp.f64100.0%

            \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right) \]
        8. Simplified100.0%

          \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
        9. Taylor expanded in a around 0

          \[\leadsto \mathsf{/.f64}\left(b, \color{blue}{2}\right) \]
        10. Step-by-step derivation
          1. Simplified18.8%

            \[\leadsto \frac{b}{\color{blue}{2}} \]

          if -160 < a

          1. Initial program 66.3%

            \[\log \left(e^{a} + e^{b}\right) \]
          2. Add Preprocessing
          3. Taylor expanded in b around 0

            \[\leadsto \color{blue}{\log \left(1 + e^{a}\right) + \frac{b}{1 + e^{a}}} \]
          4. Step-by-step derivation
            1. *-rgt-identityN/A

              \[\leadsto \log \left(1 + e^{a}\right) + \frac{b \cdot 1}{\color{blue}{1} + e^{a}} \]
            2. associate-*r/N/A

              \[\leadsto \log \left(1 + e^{a}\right) + b \cdot \color{blue}{\frac{1}{1 + e^{a}}} \]
            3. +-lowering-+.f64N/A

              \[\leadsto \mathsf{+.f64}\left(\log \left(1 + e^{a}\right), \color{blue}{\left(b \cdot \frac{1}{1 + e^{a}}\right)}\right) \]
            4. log1p-defineN/A

              \[\leadsto \mathsf{+.f64}\left(\left(\mathsf{log1p}\left(e^{a}\right)\right), \left(\color{blue}{b} \cdot \frac{1}{1 + e^{a}}\right)\right) \]
            5. log1p-lowering-log1p.f64N/A

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

              \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(b \cdot \frac{1}{1 + e^{a}}\right)\right) \]
            7. associate-*r/N/A

              \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b \cdot 1}{\color{blue}{1 + e^{a}}}\right)\right) \]
            8. *-rgt-identityN/A

              \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b}{\color{blue}{1} + e^{a}}\right)\right) \]
            9. /-lowering-/.f64N/A

              \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right)\right) \]
            10. +-lowering-+.f64N/A

              \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right)\right) \]
            11. exp-lowering-exp.f6461.1%

              \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right)\right) \]
          5. Simplified61.1%

            \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}} \]
          6. Taylor expanded in a around 0

            \[\leadsto \color{blue}{\log 2 + \frac{1}{2} \cdot b} \]
          7. Step-by-step derivation
            1. +-lowering-+.f64N/A

              \[\leadsto \mathsf{+.f64}\left(\log 2, \color{blue}{\left(\frac{1}{2} \cdot b\right)}\right) \]
            2. log-lowering-log.f64N/A

              \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \left(\color{blue}{\frac{1}{2}} \cdot b\right)\right) \]
            3. *-lowering-*.f6458.7%

              \[\leadsto \mathsf{+.f64}\left(\mathsf{log.f64}\left(2\right), \mathsf{*.f64}\left(\frac{1}{2}, \color{blue}{b}\right)\right) \]
          8. Simplified58.7%

            \[\leadsto \color{blue}{\log 2 + 0.5 \cdot b} \]
        11. Recombined 2 regimes into one program.
        12. Final simplification48.9%

          \[\leadsto \begin{array}{l} \mathbf{if}\;a \leq -160:\\ \;\;\;\;\frac{b}{2}\\ \mathbf{else}:\\ \;\;\;\;b \cdot 0.5 + \log 2\\ \end{array} \]
        13. Add Preprocessing

        Alternative 12: 56.6% accurate, 2.8× speedup?

        \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;a \leq -165:\\ \;\;\;\;\frac{b}{2}\\ \mathbf{else}:\\ \;\;\;\;\log \left(b + 2\right)\\ \end{array} \end{array} \]
        NOTE: a and b should be sorted in increasing order before calling this function.
        (FPCore (a b) :precision binary64 (if (<= a -165.0) (/ b 2.0) (log (+ b 2.0))))
        assert(a < b);
        double code(double a, double b) {
        	double tmp;
        	if (a <= -165.0) {
        		tmp = b / 2.0;
        	} else {
        		tmp = log((b + 2.0));
        	}
        	return tmp;
        }
        
        NOTE: a and b should be sorted in increasing order before calling this function.
        real(8) function code(a, b)
            real(8), intent (in) :: a
            real(8), intent (in) :: b
            real(8) :: tmp
            if (a <= (-165.0d0)) then
                tmp = b / 2.0d0
            else
                tmp = log((b + 2.0d0))
            end if
            code = tmp
        end function
        
        assert a < b;
        public static double code(double a, double b) {
        	double tmp;
        	if (a <= -165.0) {
        		tmp = b / 2.0;
        	} else {
        		tmp = Math.log((b + 2.0));
        	}
        	return tmp;
        }
        
        [a, b] = sort([a, b])
        def code(a, b):
        	tmp = 0
        	if a <= -165.0:
        		tmp = b / 2.0
        	else:
        		tmp = math.log((b + 2.0))
        	return tmp
        
        a, b = sort([a, b])
        function code(a, b)
        	tmp = 0.0
        	if (a <= -165.0)
        		tmp = Float64(b / 2.0);
        	else
        		tmp = log(Float64(b + 2.0));
        	end
        	return tmp
        end
        
        a, b = num2cell(sort([a, b])){:}
        function tmp_2 = code(a, b)
        	tmp = 0.0;
        	if (a <= -165.0)
        		tmp = b / 2.0;
        	else
        		tmp = log((b + 2.0));
        	end
        	tmp_2 = tmp;
        end
        
        NOTE: a and b should be sorted in increasing order before calling this function.
        code[a_, b_] := If[LessEqual[a, -165.0], N[(b / 2.0), $MachinePrecision], N[Log[N[(b + 2.0), $MachinePrecision]], $MachinePrecision]]
        
        \begin{array}{l}
        [a, b] = \mathsf{sort}([a, b])\\
        \\
        \begin{array}{l}
        \mathbf{if}\;a \leq -165:\\
        \;\;\;\;\frac{b}{2}\\
        
        \mathbf{else}:\\
        \;\;\;\;\log \left(b + 2\right)\\
        
        
        \end{array}
        \end{array}
        
        Derivation
        1. Split input into 2 regimes
        2. if a < -165

          1. Initial program 9.9%

            \[\log \left(e^{a} + e^{b}\right) \]
          2. Add Preprocessing
          3. Taylor expanded in b around 0

            \[\leadsto \color{blue}{\log \left(1 + e^{a}\right) + \frac{b}{1 + e^{a}}} \]
          4. Step-by-step derivation
            1. *-rgt-identityN/A

              \[\leadsto \log \left(1 + e^{a}\right) + \frac{b \cdot 1}{\color{blue}{1} + e^{a}} \]
            2. associate-*r/N/A

              \[\leadsto \log \left(1 + e^{a}\right) + b \cdot \color{blue}{\frac{1}{1 + e^{a}}} \]
            3. +-lowering-+.f64N/A

              \[\leadsto \mathsf{+.f64}\left(\log \left(1 + e^{a}\right), \color{blue}{\left(b \cdot \frac{1}{1 + e^{a}}\right)}\right) \]
            4. log1p-defineN/A

              \[\leadsto \mathsf{+.f64}\left(\left(\mathsf{log1p}\left(e^{a}\right)\right), \left(\color{blue}{b} \cdot \frac{1}{1 + e^{a}}\right)\right) \]
            5. log1p-lowering-log1p.f64N/A

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

              \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(b \cdot \frac{1}{1 + e^{a}}\right)\right) \]
            7. associate-*r/N/A

              \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b \cdot 1}{\color{blue}{1 + e^{a}}}\right)\right) \]
            8. *-rgt-identityN/A

              \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b}{\color{blue}{1} + e^{a}}\right)\right) \]
            9. /-lowering-/.f64N/A

              \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right)\right) \]
            10. +-lowering-+.f64N/A

              \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right)\right) \]
            11. exp-lowering-exp.f64100.0%

              \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right)\right) \]
          5. Simplified100.0%

            \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}} \]
          6. Taylor expanded in b around inf

            \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
          7. Step-by-step derivation
            1. /-lowering-/.f64N/A

              \[\leadsto \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right) \]
            2. +-lowering-+.f64N/A

              \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right) \]
            3. exp-lowering-exp.f64100.0%

              \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right) \]
          8. Simplified100.0%

            \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
          9. Taylor expanded in a around 0

            \[\leadsto \mathsf{/.f64}\left(b, \color{blue}{2}\right) \]
          10. Step-by-step derivation
            1. Simplified18.8%

              \[\leadsto \frac{b}{\color{blue}{2}} \]

            if -165 < a

            1. Initial program 66.3%

              \[\log \left(e^{a} + e^{b}\right) \]
            2. Add Preprocessing
            3. Taylor expanded in b around 0

              \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \color{blue}{\left(1 + b \cdot \left(1 + \frac{1}{2} \cdot b\right)\right)}\right)\right) \]
            4. Step-by-step derivation
              1. +-lowering-+.f64N/A

                \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \left(b \cdot \left(1 + \frac{1}{2} \cdot b\right)\right)\right)\right)\right) \]
              2. *-lowering-*.f64N/A

                \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \left(1 + \frac{1}{2} \cdot b\right)\right)\right)\right)\right) \]
              3. +-lowering-+.f64N/A

                \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \mathsf{+.f64}\left(1, \left(\frac{1}{2} \cdot b\right)\right)\right)\right)\right)\right) \]
              4. *-commutativeN/A

                \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \mathsf{+.f64}\left(1, \left(b \cdot \frac{1}{2}\right)\right)\right)\right)\right)\right) \]
              5. *-lowering-*.f6460.0%

                \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{*.f64}\left(b, \frac{1}{2}\right)\right)\right)\right)\right)\right) \]
            5. Simplified60.0%

              \[\leadsto \log \left(e^{a} + \color{blue}{\left(1 + b \cdot \left(1 + b \cdot 0.5\right)\right)}\right) \]
            6. Taylor expanded in b around 0

              \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \color{blue}{\left(1 + b\right)}\right)\right) \]
            7. Step-by-step derivation
              1. +-commutativeN/A

                \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \left(b + 1\right)\right)\right) \]
              2. +-lowering-+.f6458.6%

                \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(\mathsf{exp.f64}\left(a\right), \mathsf{+.f64}\left(b, 1\right)\right)\right) \]
            8. Simplified58.6%

              \[\leadsto \log \left(e^{a} + \color{blue}{\left(b + 1\right)}\right) \]
            9. Taylor expanded in a around 0

              \[\leadsto \color{blue}{\log \left(2 + b\right)} \]
            10. Step-by-step derivation
              1. log-lowering-log.f64N/A

                \[\leadsto \mathsf{log.f64}\left(\left(2 + b\right)\right) \]
              2. +-lowering-+.f6457.7%

                \[\leadsto \mathsf{log.f64}\left(\mathsf{+.f64}\left(2, b\right)\right) \]
            11. Simplified57.7%

              \[\leadsto \color{blue}{\log \left(2 + b\right)} \]
          11. Recombined 2 regimes into one program.
          12. Final simplification48.1%

            \[\leadsto \begin{array}{l} \mathbf{if}\;a \leq -165:\\ \;\;\;\;\frac{b}{2}\\ \mathbf{else}:\\ \;\;\;\;\log \left(b + 2\right)\\ \end{array} \]
          13. Add Preprocessing

          Alternative 13: 56.1% accurate, 2.9× speedup?

          \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;a \leq -145:\\ \;\;\;\;\frac{b}{2}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{log1p}\left(1\right)\\ \end{array} \end{array} \]
          NOTE: a and b should be sorted in increasing order before calling this function.
          (FPCore (a b) :precision binary64 (if (<= a -145.0) (/ b 2.0) (log1p 1.0)))
          assert(a < b);
          double code(double a, double b) {
          	double tmp;
          	if (a <= -145.0) {
          		tmp = b / 2.0;
          	} else {
          		tmp = log1p(1.0);
          	}
          	return tmp;
          }
          
          assert a < b;
          public static double code(double a, double b) {
          	double tmp;
          	if (a <= -145.0) {
          		tmp = b / 2.0;
          	} else {
          		tmp = Math.log1p(1.0);
          	}
          	return tmp;
          }
          
          [a, b] = sort([a, b])
          def code(a, b):
          	tmp = 0
          	if a <= -145.0:
          		tmp = b / 2.0
          	else:
          		tmp = math.log1p(1.0)
          	return tmp
          
          a, b = sort([a, b])
          function code(a, b)
          	tmp = 0.0
          	if (a <= -145.0)
          		tmp = Float64(b / 2.0);
          	else
          		tmp = log1p(1.0);
          	end
          	return tmp
          end
          
          NOTE: a and b should be sorted in increasing order before calling this function.
          code[a_, b_] := If[LessEqual[a, -145.0], N[(b / 2.0), $MachinePrecision], N[Log[1 + 1.0], $MachinePrecision]]
          
          \begin{array}{l}
          [a, b] = \mathsf{sort}([a, b])\\
          \\
          \begin{array}{l}
          \mathbf{if}\;a \leq -145:\\
          \;\;\;\;\frac{b}{2}\\
          
          \mathbf{else}:\\
          \;\;\;\;\mathsf{log1p}\left(1\right)\\
          
          
          \end{array}
          \end{array}
          
          Derivation
          1. Split input into 2 regimes
          2. if a < -145

            1. Initial program 9.9%

              \[\log \left(e^{a} + e^{b}\right) \]
            2. Add Preprocessing
            3. Taylor expanded in b around 0

              \[\leadsto \color{blue}{\log \left(1 + e^{a}\right) + \frac{b}{1 + e^{a}}} \]
            4. Step-by-step derivation
              1. *-rgt-identityN/A

                \[\leadsto \log \left(1 + e^{a}\right) + \frac{b \cdot 1}{\color{blue}{1} + e^{a}} \]
              2. associate-*r/N/A

                \[\leadsto \log \left(1 + e^{a}\right) + b \cdot \color{blue}{\frac{1}{1 + e^{a}}} \]
              3. +-lowering-+.f64N/A

                \[\leadsto \mathsf{+.f64}\left(\log \left(1 + e^{a}\right), \color{blue}{\left(b \cdot \frac{1}{1 + e^{a}}\right)}\right) \]
              4. log1p-defineN/A

                \[\leadsto \mathsf{+.f64}\left(\left(\mathsf{log1p}\left(e^{a}\right)\right), \left(\color{blue}{b} \cdot \frac{1}{1 + e^{a}}\right)\right) \]
              5. log1p-lowering-log1p.f64N/A

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

                \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(b \cdot \frac{1}{1 + e^{a}}\right)\right) \]
              7. associate-*r/N/A

                \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b \cdot 1}{\color{blue}{1 + e^{a}}}\right)\right) \]
              8. *-rgt-identityN/A

                \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b}{\color{blue}{1} + e^{a}}\right)\right) \]
              9. /-lowering-/.f64N/A

                \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right)\right) \]
              10. +-lowering-+.f64N/A

                \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right)\right) \]
              11. exp-lowering-exp.f64100.0%

                \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right)\right) \]
            5. Simplified100.0%

              \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}} \]
            6. Taylor expanded in b around inf

              \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
            7. Step-by-step derivation
              1. /-lowering-/.f64N/A

                \[\leadsto \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right) \]
              2. +-lowering-+.f64N/A

                \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right) \]
              3. exp-lowering-exp.f64100.0%

                \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right) \]
            8. Simplified100.0%

              \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
            9. Taylor expanded in a around 0

              \[\leadsto \mathsf{/.f64}\left(b, \color{blue}{2}\right) \]
            10. Step-by-step derivation
              1. Simplified18.8%

                \[\leadsto \frac{b}{\color{blue}{2}} \]

              if -145 < a

              1. Initial program 66.3%

                \[\log \left(e^{a} + e^{b}\right) \]
              2. Add Preprocessing
              3. Taylor expanded in b around 0

                \[\leadsto \color{blue}{\log \left(1 + e^{a}\right)} \]
              4. Step-by-step derivation
                1. log1p-defineN/A

                  \[\leadsto \mathsf{log1p}\left(e^{a}\right) \]
                2. log1p-lowering-log1p.f64N/A

                  \[\leadsto \mathsf{log1p.f64}\left(\left(e^{a}\right)\right) \]
                3. exp-lowering-exp.f6461.4%

                  \[\leadsto \mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right) \]
              5. Simplified61.4%

                \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right)} \]
              6. Taylor expanded in a around 0

                \[\leadsto \mathsf{log1p.f64}\left(\color{blue}{1}\right) \]
              7. Step-by-step derivation
                1. Simplified58.8%

                  \[\leadsto \mathsf{log1p}\left(\color{blue}{1}\right) \]
              8. Recombined 2 regimes into one program.
              9. Add Preprocessing

              Alternative 14: 12.0% accurate, 101.0× speedup?

              \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \frac{b}{2} \end{array} \]
              NOTE: a and b should be sorted in increasing order before calling this function.
              (FPCore (a b) :precision binary64 (/ b 2.0))
              assert(a < b);
              double code(double a, double b) {
              	return b / 2.0;
              }
              
              NOTE: a and b should be sorted in increasing order before calling this function.
              real(8) function code(a, b)
                  real(8), intent (in) :: a
                  real(8), intent (in) :: b
                  code = b / 2.0d0
              end function
              
              assert a < b;
              public static double code(double a, double b) {
              	return b / 2.0;
              }
              
              [a, b] = sort([a, b])
              def code(a, b):
              	return b / 2.0
              
              a, b = sort([a, b])
              function code(a, b)
              	return Float64(b / 2.0)
              end
              
              a, b = num2cell(sort([a, b])){:}
              function tmp = code(a, b)
              	tmp = b / 2.0;
              end
              
              NOTE: a and b should be sorted in increasing order before calling this function.
              code[a_, b_] := N[(b / 2.0), $MachinePrecision]
              
              \begin{array}{l}
              [a, b] = \mathsf{sort}([a, b])\\
              \\
              \frac{b}{2}
              \end{array}
              
              Derivation
              1. Initial program 52.4%

                \[\log \left(e^{a} + e^{b}\right) \]
              2. Add Preprocessing
              3. Taylor expanded in b around 0

                \[\leadsto \color{blue}{\log \left(1 + e^{a}\right) + \frac{b}{1 + e^{a}}} \]
              4. Step-by-step derivation
                1. *-rgt-identityN/A

                  \[\leadsto \log \left(1 + e^{a}\right) + \frac{b \cdot 1}{\color{blue}{1} + e^{a}} \]
                2. associate-*r/N/A

                  \[\leadsto \log \left(1 + e^{a}\right) + b \cdot \color{blue}{\frac{1}{1 + e^{a}}} \]
                3. +-lowering-+.f64N/A

                  \[\leadsto \mathsf{+.f64}\left(\log \left(1 + e^{a}\right), \color{blue}{\left(b \cdot \frac{1}{1 + e^{a}}\right)}\right) \]
                4. log1p-defineN/A

                  \[\leadsto \mathsf{+.f64}\left(\left(\mathsf{log1p}\left(e^{a}\right)\right), \left(\color{blue}{b} \cdot \frac{1}{1 + e^{a}}\right)\right) \]
                5. log1p-lowering-log1p.f64N/A

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

                  \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(b \cdot \frac{1}{1 + e^{a}}\right)\right) \]
                7. associate-*r/N/A

                  \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b \cdot 1}{\color{blue}{1 + e^{a}}}\right)\right) \]
                8. *-rgt-identityN/A

                  \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \left(\frac{b}{\color{blue}{1} + e^{a}}\right)\right) \]
                9. /-lowering-/.f64N/A

                  \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right)\right) \]
                10. +-lowering-+.f64N/A

                  \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right)\right) \]
                11. exp-lowering-exp.f6470.7%

                  \[\leadsto \mathsf{+.f64}\left(\mathsf{log1p.f64}\left(\mathsf{exp.f64}\left(a\right)\right), \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right)\right) \]
              5. Simplified70.7%

                \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}} \]
              6. Taylor expanded in b around inf

                \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
              7. Step-by-step derivation
                1. /-lowering-/.f64N/A

                  \[\leadsto \mathsf{/.f64}\left(b, \color{blue}{\left(1 + e^{a}\right)}\right) \]
                2. +-lowering-+.f64N/A

                  \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \color{blue}{\left(e^{a}\right)}\right)\right) \]
                3. exp-lowering-exp.f6427.4%

                  \[\leadsto \mathsf{/.f64}\left(b, \mathsf{+.f64}\left(1, \mathsf{exp.f64}\left(a\right)\right)\right) \]
              8. Simplified27.4%

                \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
              9. Taylor expanded in a around 0

                \[\leadsto \mathsf{/.f64}\left(b, \color{blue}{2}\right) \]
              10. Step-by-step derivation
                1. Simplified7.4%

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

                Reproduce

                ?
                herbie shell --seed 2024155 
                (FPCore (a b)
                  :name "symmetry log of sum of exp"
                  :precision binary64
                  (log (+ (exp a) (exp b))))