symmetry log of sum of exp

Percentage Accurate: 53.6% → 98.6%
Time: 12.2s
Alternatives: 18
Speedup: 1.5×

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 18 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.6% 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.6% accurate, 0.6× speedup?

\[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} t_0 := 1 + e^{a}\\ b \cdot \mathsf{fma}\left(b \cdot -0.5, {t\_0}^{-2}, \frac{\mathsf{fma}\left(b, 0.5, 1\right)}{t\_0}\right) + \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
 (let* ((t_0 (+ 1.0 (exp a))))
   (+
    (* b (fma (* b -0.5) (pow t_0 -2.0) (/ (fma b 0.5 1.0) t_0)))
    (log1p (exp a)))))
assert(a < b);
double code(double a, double b) {
	double t_0 = 1.0 + exp(a);
	return (b * fma((b * -0.5), pow(t_0, -2.0), (fma(b, 0.5, 1.0) / t_0))) + log1p(exp(a));
}
a, b = sort([a, b])
function code(a, b)
	t_0 = Float64(1.0 + exp(a))
	return Float64(Float64(b * fma(Float64(b * -0.5), (t_0 ^ -2.0), Float64(fma(b, 0.5, 1.0) / t_0))) + log1p(exp(a)))
end
NOTE: a and b should be sorted in increasing order before calling this function.
code[a_, b_] := Block[{t$95$0 = N[(1.0 + N[Exp[a], $MachinePrecision]), $MachinePrecision]}, N[(N[(b * N[(N[(b * -0.5), $MachinePrecision] * N[Power[t$95$0, -2.0], $MachinePrecision] + N[(N[(b * 0.5 + 1.0), $MachinePrecision] / t$95$0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[Log[1 + N[Exp[a], $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
[a, b] = \mathsf{sort}([a, b])\\
\\
\begin{array}{l}
t_0 := 1 + e^{a}\\
b \cdot \mathsf{fma}\left(b \cdot -0.5, {t\_0}^{-2}, \frac{\mathsf{fma}\left(b, 0.5, 1\right)}{t\_0}\right) + \mathsf{log1p}\left(e^{a}\right)
\end{array}
\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) + b \cdot \left(\frac{1}{2} \cdot \left(b \cdot \left(\frac{1}{1 + e^{a}} - \frac{1}{{\left(1 + e^{a}\right)}^{2}}\right)\right) + \frac{1}{1 + e^{a}}\right)} \]
  4. Step-by-step derivation
    1. +-commutativeN/A

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

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

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

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

      \[\leadsto \color{blue}{\mathsf{fma}\left(b, b \cdot \left(\frac{1}{2} \cdot \left(\frac{1}{1 + e^{a}} - \frac{1}{{\left(1 + e^{a}\right)}^{2}}\right)\right) + \frac{1}{1 + e^{a}}, \log \left(1 + e^{a}\right)\right)} \]
  5. Simplified72.5%

    \[\leadsto \color{blue}{\mathsf{fma}\left(b, \mathsf{fma}\left(\mathsf{fma}\left(b, 0.5, 1\right), \frac{1}{1 + e^{a}}, \frac{b \cdot -0.5}{{\left(1 + e^{a}\right)}^{2}}\right), \mathsf{log1p}\left(e^{a}\right)\right)} \]
  6. Step-by-step derivation
    1. Applied egg-rr72.5%

      \[\leadsto \color{blue}{b \cdot \mathsf{fma}\left(b \cdot -0.5, {\left(1 + e^{a}\right)}^{-2}, \frac{\mathsf{fma}\left(b, 0.5, 1\right)}{1 + e^{a}}\right) + \mathsf{log1p}\left(e^{a}\right)} \]
    2. Add Preprocessing

    Alternative 2: 96.8% accurate, 0.7× speedup?

    \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;e^{a} + e^{b} \leq 1.1:\\ \;\;\;\;\frac{b}{1 + e^{a}}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{log1p}\left(e^{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) (exp b)) 1.1) (/ b (+ 1.0 (exp a))) (log1p (exp b))))
    assert(a < b);
    double code(double a, double b) {
    	double tmp;
    	if ((exp(a) + exp(b)) <= 1.1) {
    		tmp = b / (1.0 + exp(a));
    	} else {
    		tmp = log1p(exp(b));
    	}
    	return tmp;
    }
    
    assert a < b;
    public static double code(double a, double b) {
    	double tmp;
    	if ((Math.exp(a) + Math.exp(b)) <= 1.1) {
    		tmp = b / (1.0 + Math.exp(a));
    	} else {
    		tmp = Math.log1p(Math.exp(b));
    	}
    	return tmp;
    }
    
    [a, b] = sort([a, b])
    def code(a, b):
    	tmp = 0
    	if (math.exp(a) + math.exp(b)) <= 1.1:
    		tmp = b / (1.0 + math.exp(a))
    	else:
    		tmp = math.log1p(math.exp(b))
    	return tmp
    
    a, b = sort([a, b])
    function code(a, b)
    	tmp = 0.0
    	if (Float64(exp(a) + exp(b)) <= 1.1)
    		tmp = Float64(b / Float64(1.0 + exp(a)));
    	else
    		tmp = log1p(exp(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[(N[Exp[a], $MachinePrecision] + N[Exp[b], $MachinePrecision]), $MachinePrecision], 1.1], N[(b / N[(1.0 + N[Exp[a], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[Log[1 + N[Exp[b], $MachinePrecision]], $MachinePrecision]]
    
    \begin{array}{l}
    [a, b] = \mathsf{sort}([a, b])\\
    \\
    \begin{array}{l}
    \mathbf{if}\;e^{a} + e^{b} \leq 1.1:\\
    \;\;\;\;\frac{b}{1 + e^{a}}\\
    
    \mathbf{else}:\\
    \;\;\;\;\mathsf{log1p}\left(e^{b}\right)\\
    
    
    \end{array}
    \end{array}
    
    Derivation
    1. Split input into 2 regimes
    2. if (+.f64 (exp.f64 a) (exp.f64 b)) < 1.1000000000000001

      1. Initial program 9.2%

        \[\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) + b \cdot \left(\frac{1}{2} \cdot \left(b \cdot \left(\frac{1}{1 + e^{a}} - \frac{1}{{\left(1 + e^{a}\right)}^{2}}\right)\right) + \frac{1}{1 + e^{a}}\right)} \]
      4. Step-by-step derivation
        1. +-commutativeN/A

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

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

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

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

          \[\leadsto \color{blue}{\mathsf{fma}\left(b, b \cdot \left(\frac{1}{2} \cdot \left(\frac{1}{1 + e^{a}} - \frac{1}{{\left(1 + e^{a}\right)}^{2}}\right)\right) + \frac{1}{1 + e^{a}}, \log \left(1 + e^{a}\right)\right)} \]
      5. Simplified50.0%

        \[\leadsto \color{blue}{\mathsf{fma}\left(b, \mathsf{fma}\left(\mathsf{fma}\left(b, 0.5, 1\right), \frac{1}{1 + e^{a}}, \frac{b \cdot -0.5}{{\left(1 + e^{a}\right)}^{2}}\right), \mathsf{log1p}\left(e^{a}\right)\right)} \]
      6. Step-by-step derivation
        1. Applied egg-rr50.0%

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

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

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

            \[\leadsto \frac{b}{\color{blue}{1 + e^{a}}} + \mathsf{log1p}\left(e^{a}\right) \]
          3. lower-exp.f6450.2

            \[\leadsto \frac{b}{1 + \color{blue}{e^{a}}} + \mathsf{log1p}\left(e^{a}\right) \]
        4. Simplified50.2%

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

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

            \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
          2. lower-+.f64N/A

            \[\leadsto \frac{b}{\color{blue}{1 + e^{a}}} \]
          3. lower-exp.f6449.0

            \[\leadsto \frac{b}{1 + \color{blue}{e^{a}}} \]
        7. Simplified49.0%

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

        if 1.1000000000000001 < (+.f64 (exp.f64 a) (exp.f64 b))

        1. Initial program 97.5%

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

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

            \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{b}\right)} \]
          2. lower-exp.f6495.1

            \[\leadsto \mathsf{log1p}\left(\color{blue}{e^{b}}\right) \]
        5. Simplified95.1%

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

      Alternative 3: 96.8% accurate, 0.9× speedup?

      \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;e^{a} + e^{b} \leq 1.5:\\ \;\;\;\;\frac{b}{1 + e^{a}}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(a, \mathsf{fma}\left(b, -0.25, 0.5\right), \mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.125, 0.5\right), \log 2\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) (exp b)) 1.5)
         (/ b (+ 1.0 (exp a)))
         (fma a (fma b -0.25 0.5) (fma b (fma b 0.125 0.5) (log 2.0)))))
      assert(a < b);
      double code(double a, double b) {
      	double tmp;
      	if ((exp(a) + exp(b)) <= 1.5) {
      		tmp = b / (1.0 + exp(a));
      	} else {
      		tmp = fma(a, fma(b, -0.25, 0.5), fma(b, fma(b, 0.125, 0.5), log(2.0)));
      	}
      	return tmp;
      }
      
      a, b = sort([a, b])
      function code(a, b)
      	tmp = 0.0
      	if (Float64(exp(a) + exp(b)) <= 1.5)
      		tmp = Float64(b / Float64(1.0 + exp(a)));
      	else
      		tmp = fma(a, fma(b, -0.25, 0.5), fma(b, fma(b, 0.125, 0.5), log(2.0)));
      	end
      	return tmp
      end
      
      NOTE: a and b should be sorted in increasing order before calling this function.
      code[a_, b_] := If[LessEqual[N[(N[Exp[a], $MachinePrecision] + N[Exp[b], $MachinePrecision]), $MachinePrecision], 1.5], N[(b / N[(1.0 + N[Exp[a], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(a * N[(b * -0.25 + 0.5), $MachinePrecision] + N[(b * N[(b * 0.125 + 0.5), $MachinePrecision] + N[Log[2.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
      
      \begin{array}{l}
      [a, b] = \mathsf{sort}([a, b])\\
      \\
      \begin{array}{l}
      \mathbf{if}\;e^{a} + e^{b} \leq 1.5:\\
      \;\;\;\;\frac{b}{1 + e^{a}}\\
      
      \mathbf{else}:\\
      \;\;\;\;\mathsf{fma}\left(a, \mathsf{fma}\left(b, -0.25, 0.5\right), \mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.125, 0.5\right), \log 2\right)\right)\\
      
      
      \end{array}
      \end{array}
      
      Derivation
      1. Split input into 2 regimes
      2. if (+.f64 (exp.f64 a) (exp.f64 b)) < 1.5

        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) + b \cdot \left(\frac{1}{2} \cdot \left(b \cdot \left(\frac{1}{1 + e^{a}} - \frac{1}{{\left(1 + e^{a}\right)}^{2}}\right)\right) + \frac{1}{1 + e^{a}}\right)} \]
        4. Step-by-step derivation
          1. +-commutativeN/A

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

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

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

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

            \[\leadsto \color{blue}{\mathsf{fma}\left(b, b \cdot \left(\frac{1}{2} \cdot \left(\frac{1}{1 + e^{a}} - \frac{1}{{\left(1 + e^{a}\right)}^{2}}\right)\right) + \frac{1}{1 + e^{a}}, \log \left(1 + e^{a}\right)\right)} \]
        5. Simplified49.8%

          \[\leadsto \color{blue}{\mathsf{fma}\left(b, \mathsf{fma}\left(\mathsf{fma}\left(b, 0.5, 1\right), \frac{1}{1 + e^{a}}, \frac{b \cdot -0.5}{{\left(1 + e^{a}\right)}^{2}}\right), \mathsf{log1p}\left(e^{a}\right)\right)} \]
        6. Step-by-step derivation
          1. Applied egg-rr49.8%

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

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

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

              \[\leadsto \frac{b}{\color{blue}{1 + e^{a}}} + \mathsf{log1p}\left(e^{a}\right) \]
            3. lower-exp.f6449.9

              \[\leadsto \frac{b}{1 + \color{blue}{e^{a}}} + \mathsf{log1p}\left(e^{a}\right) \]
          4. Simplified49.9%

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

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

              \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
            2. lower-+.f64N/A

              \[\leadsto \frac{b}{\color{blue}{1 + e^{a}}} \]
            3. lower-exp.f6448.6

              \[\leadsto \frac{b}{1 + \color{blue}{e^{a}}} \]
          7. Simplified48.6%

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

          if 1.5 < (+.f64 (exp.f64 a) (exp.f64 b))

          1. Initial program 97.5%

            \[\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) + b \cdot \left(\frac{1}{2} \cdot \left(b \cdot \left(\frac{1}{1 + e^{a}} - \frac{1}{{\left(1 + e^{a}\right)}^{2}}\right)\right) + \frac{1}{1 + e^{a}}\right)} \]
          4. Step-by-step derivation
            1. +-commutativeN/A

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

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

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

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

              \[\leadsto \color{blue}{\mathsf{fma}\left(b, b \cdot \left(\frac{1}{2} \cdot \left(\frac{1}{1 + e^{a}} - \frac{1}{{\left(1 + e^{a}\right)}^{2}}\right)\right) + \frac{1}{1 + e^{a}}, \log \left(1 + e^{a}\right)\right)} \]
          5. Simplified96.7%

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

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

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

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

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

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

              \[\leadsto \log 2 + \left(a \cdot \left(\frac{1}{2} + b \cdot \color{blue}{\left(0 - \frac{1}{4}\right)}\right) + b \cdot \left(\frac{1}{2} + \left(\frac{-1}{8} \cdot b + \frac{1}{4} \cdot b\right)\right)\right) \]
            6. mul0-rgtN/A

              \[\leadsto \log 2 + \left(a \cdot \left(\frac{1}{2} + b \cdot \left(\color{blue}{b \cdot 0} - \frac{1}{4}\right)\right) + b \cdot \left(\frac{1}{2} + \left(\frac{-1}{8} \cdot b + \frac{1}{4} \cdot b\right)\right)\right) \]
            7. metadata-evalN/A

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

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

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

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

            \[\leadsto \color{blue}{\mathsf{fma}\left(a, \mathsf{fma}\left(b, -0.25, 0.5\right), \mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.125, 0.5\right), \log 2\right)\right)} \]
        7. Recombined 2 regimes into one program.
        8. Add Preprocessing

        Alternative 4: 96.3% accurate, 0.9× speedup?

        \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;e^{a} + e^{b} \leq 1.1:\\ \;\;\;\;\frac{b}{1 + e^{a}}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.125, 0.5\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) (exp b)) 1.1)
           (/ b (+ 1.0 (exp a)))
           (fma b (fma b 0.125 0.5) (log 2.0))))
        assert(a < b);
        double code(double a, double b) {
        	double tmp;
        	if ((exp(a) + exp(b)) <= 1.1) {
        		tmp = b / (1.0 + exp(a));
        	} else {
        		tmp = fma(b, fma(b, 0.125, 0.5), log(2.0));
        	}
        	return tmp;
        }
        
        a, b = sort([a, b])
        function code(a, b)
        	tmp = 0.0
        	if (Float64(exp(a) + exp(b)) <= 1.1)
        		tmp = Float64(b / Float64(1.0 + exp(a)));
        	else
        		tmp = fma(b, fma(b, 0.125, 0.5), log(2.0));
        	end
        	return tmp
        end
        
        NOTE: a and b should be sorted in increasing order before calling this function.
        code[a_, b_] := If[LessEqual[N[(N[Exp[a], $MachinePrecision] + N[Exp[b], $MachinePrecision]), $MachinePrecision], 1.1], N[(b / N[(1.0 + N[Exp[a], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(b * N[(b * 0.125 + 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} + e^{b} \leq 1.1:\\
        \;\;\;\;\frac{b}{1 + e^{a}}\\
        
        \mathbf{else}:\\
        \;\;\;\;\mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.125, 0.5\right), \log 2\right)\\
        
        
        \end{array}
        \end{array}
        
        Derivation
        1. Split input into 2 regimes
        2. if (+.f64 (exp.f64 a) (exp.f64 b)) < 1.1000000000000001

          1. Initial program 9.2%

            \[\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) + b \cdot \left(\frac{1}{2} \cdot \left(b \cdot \left(\frac{1}{1 + e^{a}} - \frac{1}{{\left(1 + e^{a}\right)}^{2}}\right)\right) + \frac{1}{1 + e^{a}}\right)} \]
          4. Step-by-step derivation
            1. +-commutativeN/A

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

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

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

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

              \[\leadsto \color{blue}{\mathsf{fma}\left(b, b \cdot \left(\frac{1}{2} \cdot \left(\frac{1}{1 + e^{a}} - \frac{1}{{\left(1 + e^{a}\right)}^{2}}\right)\right) + \frac{1}{1 + e^{a}}, \log \left(1 + e^{a}\right)\right)} \]
          5. Simplified50.0%

            \[\leadsto \color{blue}{\mathsf{fma}\left(b, \mathsf{fma}\left(\mathsf{fma}\left(b, 0.5, 1\right), \frac{1}{1 + e^{a}}, \frac{b \cdot -0.5}{{\left(1 + e^{a}\right)}^{2}}\right), \mathsf{log1p}\left(e^{a}\right)\right)} \]
          6. Step-by-step derivation
            1. Applied egg-rr50.0%

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

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

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

                \[\leadsto \frac{b}{\color{blue}{1 + e^{a}}} + \mathsf{log1p}\left(e^{a}\right) \]
              3. lower-exp.f6450.2

                \[\leadsto \frac{b}{1 + \color{blue}{e^{a}}} + \mathsf{log1p}\left(e^{a}\right) \]
            4. Simplified50.2%

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

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

                \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
              2. lower-+.f64N/A

                \[\leadsto \frac{b}{\color{blue}{1 + e^{a}}} \]
              3. lower-exp.f6449.0

                \[\leadsto \frac{b}{1 + \color{blue}{e^{a}}} \]
            7. Simplified49.0%

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

            if 1.1000000000000001 < (+.f64 (exp.f64 a) (exp.f64 b))

            1. Initial program 97.5%

              \[\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) + b \cdot \left(\frac{1}{2} \cdot \left(b \cdot \left(\frac{1}{1 + e^{a}} - \frac{1}{{\left(1 + e^{a}\right)}^{2}}\right)\right) + \frac{1}{1 + e^{a}}\right)} \]
            4. Step-by-step derivation
              1. +-commutativeN/A

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

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

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

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

                \[\leadsto \color{blue}{\mathsf{fma}\left(b, b \cdot \left(\frac{1}{2} \cdot \left(\frac{1}{1 + e^{a}} - \frac{1}{{\left(1 + e^{a}\right)}^{2}}\right)\right) + \frac{1}{1 + e^{a}}, \log \left(1 + e^{a}\right)\right)} \]
            5. Simplified96.1%

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

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

                \[\leadsto \color{blue}{b \cdot \left(\frac{1}{2} + \left(\frac{-1}{8} \cdot b + \frac{1}{4} \cdot b\right)\right) + \log 2} \]
              2. distribute-rgt-outN/A

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

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

                \[\leadsto b \cdot \left(\frac{1}{2} + \color{blue}{\frac{1}{8} \cdot b}\right) + \log 2 \]
              5. lower-fma.f64N/A

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

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

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

                \[\leadsto \mathsf{fma}\left(b, \color{blue}{\mathsf{fma}\left(b, \frac{1}{8}, \frac{1}{2}\right)}, \log 2\right) \]
              9. lower-log.f6493.6

                \[\leadsto \mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.125, 0.5\right), \color{blue}{\log 2}\right) \]
            8. Simplified93.6%

              \[\leadsto \color{blue}{\mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.125, 0.5\right), \log 2\right)} \]
          7. Recombined 2 regimes into one program.
          8. Add Preprocessing

          Alternative 5: 95.2% accurate, 0.9× speedup?

          \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;e^{a} + e^{b} \leq 1.1:\\ \;\;\;\;\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.125, 0.5\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) (exp b)) 1.1)
             (fma (* b b) (* b -0.16666666666666666) b)
             (fma b (fma b 0.125 0.5) (log 2.0))))
          assert(a < b);
          double code(double a, double b) {
          	double tmp;
          	if ((exp(a) + exp(b)) <= 1.1) {
          		tmp = fma((b * b), (b * -0.16666666666666666), b);
          	} else {
          		tmp = fma(b, fma(b, 0.125, 0.5), log(2.0));
          	}
          	return tmp;
          }
          
          a, b = sort([a, b])
          function code(a, b)
          	tmp = 0.0
          	if (Float64(exp(a) + exp(b)) <= 1.1)
          		tmp = fma(Float64(b * b), Float64(b * -0.16666666666666666), b);
          	else
          		tmp = fma(b, fma(b, 0.125, 0.5), log(2.0));
          	end
          	return tmp
          end
          
          NOTE: a and b should be sorted in increasing order before calling this function.
          code[a_, b_] := If[LessEqual[N[(N[Exp[a], $MachinePrecision] + N[Exp[b], $MachinePrecision]), $MachinePrecision], 1.1], N[(N[(b * b), $MachinePrecision] * N[(b * -0.16666666666666666), $MachinePrecision] + b), $MachinePrecision], N[(b * N[(b * 0.125 + 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} + e^{b} \leq 1.1:\\
          \;\;\;\;\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)\\
          
          \mathbf{else}:\\
          \;\;\;\;\mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.125, 0.5\right), \log 2\right)\\
          
          
          \end{array}
          \end{array}
          
          Derivation
          1. Split input into 2 regimes
          2. if (+.f64 (exp.f64 a) (exp.f64 b)) < 1.1000000000000001

            1. Initial program 9.2%

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

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

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

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

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

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

                \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot \frac{1}{2}} + 1, e^{a}\right)\right) \]
              6. lower-fma.f64N/A

                \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{\mathsf{fma}\left(b, \frac{1}{2}, 1\right)}, e^{a}\right)\right) \]
              7. lower-exp.f645.5

                \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.5, 1\right), \color{blue}{e^{a}}\right)\right) \]
            5. Simplified5.5%

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

              \[\leadsto \log \left(1 + \color{blue}{{b}^{2} \cdot \left(\frac{1}{2} + \frac{1}{b}\right)}\right) \]
            7. Step-by-step derivation
              1. distribute-lft-inN/A

                \[\leadsto \log \left(1 + \color{blue}{\left({b}^{2} \cdot \frac{1}{2} + {b}^{2} \cdot \frac{1}{b}\right)}\right) \]
              2. unpow2N/A

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

                \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + \color{blue}{b \cdot \left(b \cdot \frac{1}{b}\right)}\right)\right) \]
              4. rgt-mult-inverseN/A

                \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + b \cdot \color{blue}{1}\right)\right) \]
              5. *-rgt-identityN/A

                \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + \color{blue}{b}\right)\right) \]
              6. unpow2N/A

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

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

                \[\leadsto \log \left(1 + \left(b \cdot \color{blue}{\left(\frac{1}{2} \cdot b\right)} + b\right)\right) \]
              9. lower-fma.f64N/A

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

                \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot \frac{1}{2}}, b\right)\right) \]
              11. lower-*.f645.2

                \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot 0.5}, b\right)\right) \]
            8. Simplified5.2%

              \[\leadsto \log \left(1 + \color{blue}{\mathsf{fma}\left(b, b \cdot 0.5, b\right)}\right) \]
            9. Taylor expanded in b around 0

              \[\leadsto \color{blue}{b \cdot \left(1 + \frac{-1}{6} \cdot {b}^{2}\right)} \]
            10. Step-by-step derivation
              1. +-commutativeN/A

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

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

                \[\leadsto \color{blue}{\left(b \cdot \frac{-1}{6}\right) \cdot {b}^{2}} + b \cdot 1 \]
              4. *-commutativeN/A

                \[\leadsto \color{blue}{{b}^{2} \cdot \left(b \cdot \frac{-1}{6}\right)} + b \cdot 1 \]
              5. *-rgt-identityN/A

                \[\leadsto {b}^{2} \cdot \left(b \cdot \frac{-1}{6}\right) + \color{blue}{b} \]
              6. lower-fma.f64N/A

                \[\leadsto \color{blue}{\mathsf{fma}\left({b}^{2}, b \cdot \frac{-1}{6}, b\right)} \]
              7. unpow2N/A

                \[\leadsto \mathsf{fma}\left(\color{blue}{b \cdot b}, b \cdot \frac{-1}{6}, b\right) \]
              8. lower-*.f64N/A

                \[\leadsto \mathsf{fma}\left(\color{blue}{b \cdot b}, b \cdot \frac{-1}{6}, b\right) \]
              9. lower-*.f6447.8

                \[\leadsto \mathsf{fma}\left(b \cdot b, \color{blue}{b \cdot -0.16666666666666666}, b\right) \]
            11. Simplified47.8%

              \[\leadsto \color{blue}{\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)} \]

            if 1.1000000000000001 < (+.f64 (exp.f64 a) (exp.f64 b))

            1. Initial program 97.5%

              \[\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) + b \cdot \left(\frac{1}{2} \cdot \left(b \cdot \left(\frac{1}{1 + e^{a}} - \frac{1}{{\left(1 + e^{a}\right)}^{2}}\right)\right) + \frac{1}{1 + e^{a}}\right)} \]
            4. Step-by-step derivation
              1. +-commutativeN/A

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

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

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

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

                \[\leadsto \color{blue}{\mathsf{fma}\left(b, b \cdot \left(\frac{1}{2} \cdot \left(\frac{1}{1 + e^{a}} - \frac{1}{{\left(1 + e^{a}\right)}^{2}}\right)\right) + \frac{1}{1 + e^{a}}, \log \left(1 + e^{a}\right)\right)} \]
            5. Simplified96.1%

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

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

                \[\leadsto \color{blue}{b \cdot \left(\frac{1}{2} + \left(\frac{-1}{8} \cdot b + \frac{1}{4} \cdot b\right)\right) + \log 2} \]
              2. distribute-rgt-outN/A

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

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

                \[\leadsto b \cdot \left(\frac{1}{2} + \color{blue}{\frac{1}{8} \cdot b}\right) + \log 2 \]
              5. lower-fma.f64N/A

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

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

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

                \[\leadsto \mathsf{fma}\left(b, \color{blue}{\mathsf{fma}\left(b, \frac{1}{8}, \frac{1}{2}\right)}, \log 2\right) \]
              9. lower-log.f6493.6

                \[\leadsto \mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.125, 0.5\right), \color{blue}{\log 2}\right) \]
            8. Simplified93.6%

              \[\leadsto \color{blue}{\mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.125, 0.5\right), \log 2\right)} \]
          3. Recombined 2 regimes into one program.
          4. Add Preprocessing

          Alternative 6: 95.2% accurate, 0.9× speedup?

          \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;e^{a} + e^{b} \leq 1.1:\\ \;\;\;\;\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(a, \mathsf{fma}\left(a, 0.125, 0.5\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) (exp b)) 1.1)
             (fma (* b b) (* b -0.16666666666666666) b)
             (fma a (fma a 0.125 0.5) (log 2.0))))
          assert(a < b);
          double code(double a, double b) {
          	double tmp;
          	if ((exp(a) + exp(b)) <= 1.1) {
          		tmp = fma((b * b), (b * -0.16666666666666666), b);
          	} else {
          		tmp = fma(a, fma(a, 0.125, 0.5), log(2.0));
          	}
          	return tmp;
          }
          
          a, b = sort([a, b])
          function code(a, b)
          	tmp = 0.0
          	if (Float64(exp(a) + exp(b)) <= 1.1)
          		tmp = fma(Float64(b * b), Float64(b * -0.16666666666666666), b);
          	else
          		tmp = fma(a, fma(a, 0.125, 0.5), log(2.0));
          	end
          	return tmp
          end
          
          NOTE: a and b should be sorted in increasing order before calling this function.
          code[a_, b_] := If[LessEqual[N[(N[Exp[a], $MachinePrecision] + N[Exp[b], $MachinePrecision]), $MachinePrecision], 1.1], N[(N[(b * b), $MachinePrecision] * N[(b * -0.16666666666666666), $MachinePrecision] + b), $MachinePrecision], N[(a * N[(a * 0.125 + 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} + e^{b} \leq 1.1:\\
          \;\;\;\;\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)\\
          
          \mathbf{else}:\\
          \;\;\;\;\mathsf{fma}\left(a, \mathsf{fma}\left(a, 0.125, 0.5\right), \log 2\right)\\
          
          
          \end{array}
          \end{array}
          
          Derivation
          1. Split input into 2 regimes
          2. if (+.f64 (exp.f64 a) (exp.f64 b)) < 1.1000000000000001

            1. Initial program 9.2%

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

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

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

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

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

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

                \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot \frac{1}{2}} + 1, e^{a}\right)\right) \]
              6. lower-fma.f64N/A

                \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{\mathsf{fma}\left(b, \frac{1}{2}, 1\right)}, e^{a}\right)\right) \]
              7. lower-exp.f645.5

                \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.5, 1\right), \color{blue}{e^{a}}\right)\right) \]
            5. Simplified5.5%

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

              \[\leadsto \log \left(1 + \color{blue}{{b}^{2} \cdot \left(\frac{1}{2} + \frac{1}{b}\right)}\right) \]
            7. Step-by-step derivation
              1. distribute-lft-inN/A

                \[\leadsto \log \left(1 + \color{blue}{\left({b}^{2} \cdot \frac{1}{2} + {b}^{2} \cdot \frac{1}{b}\right)}\right) \]
              2. unpow2N/A

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

                \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + \color{blue}{b \cdot \left(b \cdot \frac{1}{b}\right)}\right)\right) \]
              4. rgt-mult-inverseN/A

                \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + b \cdot \color{blue}{1}\right)\right) \]
              5. *-rgt-identityN/A

                \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + \color{blue}{b}\right)\right) \]
              6. unpow2N/A

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

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

                \[\leadsto \log \left(1 + \left(b \cdot \color{blue}{\left(\frac{1}{2} \cdot b\right)} + b\right)\right) \]
              9. lower-fma.f64N/A

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

                \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot \frac{1}{2}}, b\right)\right) \]
              11. lower-*.f645.2

                \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot 0.5}, b\right)\right) \]
            8. Simplified5.2%

              \[\leadsto \log \left(1 + \color{blue}{\mathsf{fma}\left(b, b \cdot 0.5, b\right)}\right) \]
            9. Taylor expanded in b around 0

              \[\leadsto \color{blue}{b \cdot \left(1 + \frac{-1}{6} \cdot {b}^{2}\right)} \]
            10. Step-by-step derivation
              1. +-commutativeN/A

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

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

                \[\leadsto \color{blue}{\left(b \cdot \frac{-1}{6}\right) \cdot {b}^{2}} + b \cdot 1 \]
              4. *-commutativeN/A

                \[\leadsto \color{blue}{{b}^{2} \cdot \left(b \cdot \frac{-1}{6}\right)} + b \cdot 1 \]
              5. *-rgt-identityN/A

                \[\leadsto {b}^{2} \cdot \left(b \cdot \frac{-1}{6}\right) + \color{blue}{b} \]
              6. lower-fma.f64N/A

                \[\leadsto \color{blue}{\mathsf{fma}\left({b}^{2}, b \cdot \frac{-1}{6}, b\right)} \]
              7. unpow2N/A

                \[\leadsto \mathsf{fma}\left(\color{blue}{b \cdot b}, b \cdot \frac{-1}{6}, b\right) \]
              8. lower-*.f64N/A

                \[\leadsto \mathsf{fma}\left(\color{blue}{b \cdot b}, b \cdot \frac{-1}{6}, b\right) \]
              9. lower-*.f6447.8

                \[\leadsto \mathsf{fma}\left(b \cdot b, \color{blue}{b \cdot -0.16666666666666666}, b\right) \]
            11. Simplified47.8%

              \[\leadsto \color{blue}{\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)} \]

            if 1.1000000000000001 < (+.f64 (exp.f64 a) (exp.f64 b))

            1. Initial program 97.5%

              \[\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. lower-log1p.f64N/A

                \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right)} \]
              2. lower-exp.f6495.6

                \[\leadsto \mathsf{log1p}\left(\color{blue}{e^{a}}\right) \]
            5. Simplified95.6%

              \[\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. +-commutativeN/A

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

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

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

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

                \[\leadsto \mathsf{fma}\left(a, \color{blue}{\mathsf{fma}\left(a, \frac{1}{8}, \frac{1}{2}\right)}, \log 2\right) \]
              6. lower-log.f6494.7

                \[\leadsto \mathsf{fma}\left(a, \mathsf{fma}\left(a, 0.125, 0.5\right), \color{blue}{\log 2}\right) \]
            8. Simplified94.7%

              \[\leadsto \color{blue}{\mathsf{fma}\left(a, \mathsf{fma}\left(a, 0.125, 0.5\right), \log 2\right)} \]
          3. Recombined 2 regimes into one program.
          4. Add Preprocessing

          Alternative 7: 98.4% accurate, 1.0× speedup?

          \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}} \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 (+ 1.0 (exp a)))))
          assert(a < b);
          double code(double a, double b) {
          	return log1p(exp(a)) + (b / (1.0 + exp(a)));
          }
          
          assert a < b;
          public static double code(double a, double b) {
          	return Math.log1p(Math.exp(a)) + (b / (1.0 + Math.exp(a)));
          }
          
          [a, b] = sort([a, b])
          def code(a, b):
          	return math.log1p(math.exp(a)) + (b / (1.0 + math.exp(a)))
          
          a, b = sort([a, b])
          function code(a, b)
          	return Float64(log1p(exp(a)) + Float64(b / Float64(1.0 + exp(a))))
          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[(1.0 + N[Exp[a], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
          
          \begin{array}{l}
          [a, b] = \mathsf{sort}([a, b])\\
          \\
          \mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + e^{a}}
          \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{\color{blue}{b \cdot 1}}{1 + e^{a}} \]
            2. associate-*r/N/A

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

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

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

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

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

              \[\leadsto \mathsf{log1p}\left(e^{a}\right) + \frac{\color{blue}{b}}{1 + e^{a}} \]
            8. lower-/.f64N/A

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

              \[\leadsto \mathsf{log1p}\left(e^{a}\right) + \frac{b}{\color{blue}{1 + e^{a}}} \]
            10. lower-exp.f6472.5

              \[\leadsto \mathsf{log1p}\left(e^{a}\right) + \frac{b}{1 + \color{blue}{e^{a}}} \]
          5. Simplified72.5%

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

          Alternative 8: 97.8% accurate, 1.0× speedup?

          \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;e^{a} \leq 0:\\ \;\;\;\;\frac{b}{1 + e^{a}}\\ \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 (+ 1.0 (exp a))) (log1p (exp a))))
          assert(a < b);
          double code(double a, double b) {
          	double tmp;
          	if (exp(a) <= 0.0) {
          		tmp = b / (1.0 + exp(a));
          	} 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 / (1.0 + Math.exp(a));
          	} 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 / (1.0 + math.exp(a))
          	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(1.0 + exp(a)));
          	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[(1.0 + N[Exp[a], $MachinePrecision]), $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}{1 + e^{a}}\\
          
          \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 8.2%

              \[\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) + b \cdot \left(\frac{1}{2} \cdot \left(b \cdot \left(\frac{1}{1 + e^{a}} - \frac{1}{{\left(1 + e^{a}\right)}^{2}}\right)\right) + \frac{1}{1 + e^{a}}\right)} \]
            4. Step-by-step derivation
              1. +-commutativeN/A

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

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

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

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

                \[\leadsto \color{blue}{\mathsf{fma}\left(b, b \cdot \left(\frac{1}{2} \cdot \left(\frac{1}{1 + e^{a}} - \frac{1}{{\left(1 + e^{a}\right)}^{2}}\right)\right) + \frac{1}{1 + e^{a}}, \log \left(1 + e^{a}\right)\right)} \]
            5. Simplified100.0%

              \[\leadsto \color{blue}{\mathsf{fma}\left(b, \mathsf{fma}\left(\mathsf{fma}\left(b, 0.5, 1\right), \frac{1}{1 + e^{a}}, \frac{b \cdot -0.5}{{\left(1 + e^{a}\right)}^{2}}\right), \mathsf{log1p}\left(e^{a}\right)\right)} \]
            6. Step-by-step derivation
              1. Applied egg-rr100.0%

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

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

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

                  \[\leadsto \frac{b}{\color{blue}{1 + e^{a}}} + \mathsf{log1p}\left(e^{a}\right) \]
                3. lower-exp.f64100.0

                  \[\leadsto \frac{b}{1 + \color{blue}{e^{a}}} + \mathsf{log1p}\left(e^{a}\right) \]
              4. Simplified100.0%

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

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

                  \[\leadsto \color{blue}{\frac{b}{1 + e^{a}}} \]
                2. lower-+.f64N/A

                  \[\leadsto \frac{b}{\color{blue}{1 + e^{a}}} \]
                3. lower-exp.f64100.0

                  \[\leadsto \frac{b}{1 + \color{blue}{e^{a}}} \]
              7. Simplified100.0%

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

              if 0.0 < (exp.f64 a)

              1. Initial program 66.5%

                \[\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. lower-log1p.f64N/A

                  \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right)} \]
                2. lower-exp.f6463.5

                  \[\leadsto \mathsf{log1p}\left(\color{blue}{e^{a}}\right) \]
              5. Simplified63.5%

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

            Alternative 9: 96.5% accurate, 1.3× speedup?

            \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \mathsf{log1p}\left(b \cdot \left(\mathsf{fma}\left(b, 0.5, 1\right) + \frac{e^{a}}{b}\right)\right) \end{array} \]
            NOTE: a and b should be sorted in increasing order before calling this function.
            (FPCore (a b)
             :precision binary64
             (log1p (* b (+ (fma b 0.5 1.0) (/ (exp a) b)))))
            assert(a < b);
            double code(double a, double b) {
            	return log1p((b * (fma(b, 0.5, 1.0) + (exp(a) / b))));
            }
            
            a, b = sort([a, b])
            function code(a, b)
            	return log1p(Float64(b * Float64(fma(b, 0.5, 1.0) + Float64(exp(a) / b))))
            end
            
            NOTE: a and b should be sorted in increasing order before calling this function.
            code[a_, b_] := N[Log[1 + N[(b * N[(N[(b * 0.5 + 1.0), $MachinePrecision] + N[(N[Exp[a], $MachinePrecision] / b), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
            
            \begin{array}{l}
            [a, b] = \mathsf{sort}([a, b])\\
            \\
            \mathsf{log1p}\left(b \cdot \left(\mathsf{fma}\left(b, 0.5, 1\right) + \frac{e^{a}}{b}\right)\right)
            \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 \log \color{blue}{\left(1 + \left(e^{a} + b \cdot \left(1 + \frac{1}{2} \cdot b\right)\right)\right)} \]
            4. Step-by-step derivation
              1. lower-+.f64N/A

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

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

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

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

                \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot \frac{1}{2}} + 1, e^{a}\right)\right) \]
              6. lower-fma.f64N/A

                \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{\mathsf{fma}\left(b, \frac{1}{2}, 1\right)}, e^{a}\right)\right) \]
              7. lower-exp.f6449.6

                \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.5, 1\right), \color{blue}{e^{a}}\right)\right) \]
            5. Simplified49.6%

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

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

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

                \[\leadsto \log \left(1 + \color{blue}{\mathsf{fma}\left(b, \mathsf{fma}\left(b, \frac{1}{2}, 1\right), e^{a}\right)}\right) \]
              4. lower-log1p.f6472.2

                \[\leadsto \color{blue}{\mathsf{log1p}\left(\mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.5, 1\right), e^{a}\right)\right)} \]
            7. Applied egg-rr72.2%

              \[\leadsto \color{blue}{\mathsf{log1p}\left(\mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.5, 1\right), e^{a}\right)\right)} \]
            8. Taylor expanded in b around inf

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

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

                \[\leadsto \mathsf{log1p}\left(\color{blue}{b \cdot \left(b \cdot \left(\frac{1}{2} + \left(\frac{1}{b} + \frac{e^{a}}{{b}^{2}}\right)\right)\right)}\right) \]
              3. *-commutativeN/A

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

                \[\leadsto \mathsf{log1p}\left(\color{blue}{b \cdot \left(\left(\frac{1}{2} + \left(\frac{1}{b} + \frac{e^{a}}{{b}^{2}}\right)\right) \cdot b\right)}\right) \]
              5. *-commutativeN/A

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

                \[\leadsto \mathsf{log1p}\left(b \cdot \left(b \cdot \color{blue}{\left(\left(\frac{1}{2} + \frac{1}{b}\right) + \frac{e^{a}}{{b}^{2}}\right)}\right)\right) \]
              7. distribute-rgt-inN/A

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

                \[\leadsto \mathsf{log1p}\left(b \cdot \left(\color{blue}{b \cdot \left(\frac{1}{2} + \frac{1}{b}\right)} + \frac{e^{a}}{{b}^{2}} \cdot b\right)\right) \]
              9. +-commutativeN/A

                \[\leadsto \mathsf{log1p}\left(b \cdot \left(b \cdot \color{blue}{\left(\frac{1}{b} + \frac{1}{2}\right)} + \frac{e^{a}}{{b}^{2}} \cdot b\right)\right) \]
              10. distribute-rgt-inN/A

                \[\leadsto \mathsf{log1p}\left(b \cdot \left(\color{blue}{\left(\frac{1}{b} \cdot b + \frac{1}{2} \cdot b\right)} + \frac{e^{a}}{{b}^{2}} \cdot b\right)\right) \]
              11. lft-mult-inverseN/A

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

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

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

                \[\leadsto \mathsf{log1p}\left(b \cdot \left(\left(1 + \frac{1}{2} \cdot b\right) + \frac{e^{a}}{\color{blue}{{b}^{2} \cdot \frac{1}{b}}}\right)\right) \]
              15. unpow2N/A

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

                \[\leadsto \mathsf{log1p}\left(b \cdot \left(\left(1 + \frac{1}{2} \cdot b\right) + \frac{e^{a}}{\color{blue}{b \cdot \left(b \cdot \frac{1}{b}\right)}}\right)\right) \]
              17. rgt-mult-inverseN/A

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

                \[\leadsto \mathsf{log1p}\left(b \cdot \left(\left(1 + \frac{1}{2} \cdot b\right) + \frac{e^{a}}{\color{blue}{b}}\right)\right) \]
            10. Simplified72.2%

              \[\leadsto \mathsf{log1p}\left(\color{blue}{b \cdot \left(\mathsf{fma}\left(b, 0.5, 1\right) + \frac{e^{a}}{b}\right)}\right) \]
            11. Add Preprocessing

            Alternative 10: 94.9% accurate, 1.4× speedup?

            \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;e^{a} \leq 2 \cdot 10^{-9}:\\ \;\;\;\;\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(b, 0.5, \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) 2e-9)
               (fma (* b b) (* b -0.16666666666666666) b)
               (fma b 0.5 (log 2.0))))
            assert(a < b);
            double code(double a, double b) {
            	double tmp;
            	if (exp(a) <= 2e-9) {
            		tmp = fma((b * b), (b * -0.16666666666666666), b);
            	} else {
            		tmp = fma(b, 0.5, log(2.0));
            	}
            	return tmp;
            }
            
            a, b = sort([a, b])
            function code(a, b)
            	tmp = 0.0
            	if (exp(a) <= 2e-9)
            		tmp = fma(Float64(b * b), Float64(b * -0.16666666666666666), b);
            	else
            		tmp = fma(b, 0.5, log(2.0));
            	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], 2e-9], N[(N[(b * b), $MachinePrecision] * N[(b * -0.16666666666666666), $MachinePrecision] + b), $MachinePrecision], N[(b * 0.5 + N[Log[2.0], $MachinePrecision]), $MachinePrecision]]
            
            \begin{array}{l}
            [a, b] = \mathsf{sort}([a, b])\\
            \\
            \begin{array}{l}
            \mathbf{if}\;e^{a} \leq 2 \cdot 10^{-9}:\\
            \;\;\;\;\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)\\
            
            \mathbf{else}:\\
            \;\;\;\;\mathsf{fma}\left(b, 0.5, \log 2\right)\\
            
            
            \end{array}
            \end{array}
            
            Derivation
            1. Split input into 2 regimes
            2. if (exp.f64 a) < 2.00000000000000012e-9

              1. Initial program 9.0%

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

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

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

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

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

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

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot \frac{1}{2}} + 1, e^{a}\right)\right) \]
                6. lower-fma.f64N/A

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{\mathsf{fma}\left(b, \frac{1}{2}, 1\right)}, e^{a}\right)\right) \]
                7. lower-exp.f648.1

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.5, 1\right), \color{blue}{e^{a}}\right)\right) \]
              5. Simplified8.1%

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

                \[\leadsto \log \left(1 + \color{blue}{{b}^{2} \cdot \left(\frac{1}{2} + \frac{1}{b}\right)}\right) \]
              7. Step-by-step derivation
                1. distribute-lft-inN/A

                  \[\leadsto \log \left(1 + \color{blue}{\left({b}^{2} \cdot \frac{1}{2} + {b}^{2} \cdot \frac{1}{b}\right)}\right) \]
                2. unpow2N/A

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

                  \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + \color{blue}{b \cdot \left(b \cdot \frac{1}{b}\right)}\right)\right) \]
                4. rgt-mult-inverseN/A

                  \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + b \cdot \color{blue}{1}\right)\right) \]
                5. *-rgt-identityN/A

                  \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + \color{blue}{b}\right)\right) \]
                6. unpow2N/A

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

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

                  \[\leadsto \log \left(1 + \left(b \cdot \color{blue}{\left(\frac{1}{2} \cdot b\right)} + b\right)\right) \]
                9. lower-fma.f64N/A

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

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot \frac{1}{2}}, b\right)\right) \]
                11. lower-*.f647.5

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot 0.5}, b\right)\right) \]
              8. Simplified7.5%

                \[\leadsto \log \left(1 + \color{blue}{\mathsf{fma}\left(b, b \cdot 0.5, b\right)}\right) \]
              9. Taylor expanded in b around 0

                \[\leadsto \color{blue}{b \cdot \left(1 + \frac{-1}{6} \cdot {b}^{2}\right)} \]
              10. Step-by-step derivation
                1. +-commutativeN/A

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

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

                  \[\leadsto \color{blue}{\left(b \cdot \frac{-1}{6}\right) \cdot {b}^{2}} + b \cdot 1 \]
                4. *-commutativeN/A

                  \[\leadsto \color{blue}{{b}^{2} \cdot \left(b \cdot \frac{-1}{6}\right)} + b \cdot 1 \]
                5. *-rgt-identityN/A

                  \[\leadsto {b}^{2} \cdot \left(b \cdot \frac{-1}{6}\right) + \color{blue}{b} \]
                6. lower-fma.f64N/A

                  \[\leadsto \color{blue}{\mathsf{fma}\left({b}^{2}, b \cdot \frac{-1}{6}, b\right)} \]
                7. unpow2N/A

                  \[\leadsto \mathsf{fma}\left(\color{blue}{b \cdot b}, b \cdot \frac{-1}{6}, b\right) \]
                8. lower-*.f64N/A

                  \[\leadsto \mathsf{fma}\left(\color{blue}{b \cdot b}, b \cdot \frac{-1}{6}, b\right) \]
                9. lower-*.f6495.7

                  \[\leadsto \mathsf{fma}\left(b \cdot b, \color{blue}{b \cdot -0.16666666666666666}, b\right) \]
              11. Simplified95.7%

                \[\leadsto \color{blue}{\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)} \]

              if 2.00000000000000012e-9 < (exp.f64 a)

              1. Initial program 66.8%

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

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

                  \[\leadsto \log \color{blue}{\left(1 + e^{b}\right)} \]
                2. lower-exp.f6463.7

                  \[\leadsto \log \left(1 + \color{blue}{e^{b}}\right) \]
              5. Simplified63.7%

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

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

                  \[\leadsto \color{blue}{\frac{1}{2} \cdot b + \log 2} \]
                2. *-commutativeN/A

                  \[\leadsto \color{blue}{b \cdot \frac{1}{2}} + \log 2 \]
                3. lower-fma.f64N/A

                  \[\leadsto \color{blue}{\mathsf{fma}\left(b, \frac{1}{2}, \log 2\right)} \]
                4. lower-log.f6461.7

                  \[\leadsto \mathsf{fma}\left(b, 0.5, \color{blue}{\log 2}\right) \]
              8. Simplified61.7%

                \[\leadsto \color{blue}{\mathsf{fma}\left(b, 0.5, \log 2\right)} \]
            3. Recombined 2 regimes into one program.
            4. Add Preprocessing

            Alternative 11: 96.5% accurate, 1.4× speedup?

            \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \mathsf{log1p}\left(\mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.5, 1\right), e^{a}\right)\right) \end{array} \]
            NOTE: a and b should be sorted in increasing order before calling this function.
            (FPCore (a b) :precision binary64 (log1p (fma b (fma b 0.5 1.0) (exp a))))
            assert(a < b);
            double code(double a, double b) {
            	return log1p(fma(b, fma(b, 0.5, 1.0), exp(a)));
            }
            
            a, b = sort([a, b])
            function code(a, b)
            	return log1p(fma(b, fma(b, 0.5, 1.0), exp(a)))
            end
            
            NOTE: a and b should be sorted in increasing order before calling this function.
            code[a_, b_] := N[Log[1 + N[(b * N[(b * 0.5 + 1.0), $MachinePrecision] + N[Exp[a], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
            
            \begin{array}{l}
            [a, b] = \mathsf{sort}([a, b])\\
            \\
            \mathsf{log1p}\left(\mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.5, 1\right), e^{a}\right)\right)
            \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 \log \color{blue}{\left(1 + \left(e^{a} + b \cdot \left(1 + \frac{1}{2} \cdot b\right)\right)\right)} \]
            4. Step-by-step derivation
              1. lower-+.f64N/A

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

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

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

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

                \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot \frac{1}{2}} + 1, e^{a}\right)\right) \]
              6. lower-fma.f64N/A

                \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{\mathsf{fma}\left(b, \frac{1}{2}, 1\right)}, e^{a}\right)\right) \]
              7. lower-exp.f6449.6

                \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.5, 1\right), \color{blue}{e^{a}}\right)\right) \]
            5. Simplified49.6%

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

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

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

                \[\leadsto \log \left(1 + \color{blue}{\mathsf{fma}\left(b, \mathsf{fma}\left(b, \frac{1}{2}, 1\right), e^{a}\right)}\right) \]
              4. lower-log1p.f6472.2

                \[\leadsto \color{blue}{\mathsf{log1p}\left(\mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.5, 1\right), e^{a}\right)\right)} \]
            7. Applied egg-rr72.2%

              \[\leadsto \color{blue}{\mathsf{log1p}\left(\mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.5, 1\right), e^{a}\right)\right)} \]
            8. Add Preprocessing

            Alternative 12: 94.9% accurate, 1.4× speedup?

            \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;e^{a} \leq 2 \cdot 10^{-9}:\\ \;\;\;\;\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)\\ \mathbf{else}:\\ \;\;\;\;\mathsf{log1p}\left(b + 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 (<= (exp a) 2e-9)
               (fma (* b b) (* b -0.16666666666666666) b)
               (log1p (+ b 1.0))))
            assert(a < b);
            double code(double a, double b) {
            	double tmp;
            	if (exp(a) <= 2e-9) {
            		tmp = fma((b * b), (b * -0.16666666666666666), b);
            	} else {
            		tmp = log1p((b + 1.0));
            	}
            	return tmp;
            }
            
            a, b = sort([a, b])
            function code(a, b)
            	tmp = 0.0
            	if (exp(a) <= 2e-9)
            		tmp = fma(Float64(b * b), Float64(b * -0.16666666666666666), b);
            	else
            		tmp = log1p(Float64(b + 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[N[Exp[a], $MachinePrecision], 2e-9], N[(N[(b * b), $MachinePrecision] * N[(b * -0.16666666666666666), $MachinePrecision] + b), $MachinePrecision], N[Log[1 + N[(b + 1.0), $MachinePrecision]], $MachinePrecision]]
            
            \begin{array}{l}
            [a, b] = \mathsf{sort}([a, b])\\
            \\
            \begin{array}{l}
            \mathbf{if}\;e^{a} \leq 2 \cdot 10^{-9}:\\
            \;\;\;\;\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)\\
            
            \mathbf{else}:\\
            \;\;\;\;\mathsf{log1p}\left(b + 1\right)\\
            
            
            \end{array}
            \end{array}
            
            Derivation
            1. Split input into 2 regimes
            2. if (exp.f64 a) < 2.00000000000000012e-9

              1. Initial program 9.0%

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

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

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

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

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

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

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot \frac{1}{2}} + 1, e^{a}\right)\right) \]
                6. lower-fma.f64N/A

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{\mathsf{fma}\left(b, \frac{1}{2}, 1\right)}, e^{a}\right)\right) \]
                7. lower-exp.f648.1

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.5, 1\right), \color{blue}{e^{a}}\right)\right) \]
              5. Simplified8.1%

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

                \[\leadsto \log \left(1 + \color{blue}{{b}^{2} \cdot \left(\frac{1}{2} + \frac{1}{b}\right)}\right) \]
              7. Step-by-step derivation
                1. distribute-lft-inN/A

                  \[\leadsto \log \left(1 + \color{blue}{\left({b}^{2} \cdot \frac{1}{2} + {b}^{2} \cdot \frac{1}{b}\right)}\right) \]
                2. unpow2N/A

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

                  \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + \color{blue}{b \cdot \left(b \cdot \frac{1}{b}\right)}\right)\right) \]
                4. rgt-mult-inverseN/A

                  \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + b \cdot \color{blue}{1}\right)\right) \]
                5. *-rgt-identityN/A

                  \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + \color{blue}{b}\right)\right) \]
                6. unpow2N/A

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

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

                  \[\leadsto \log \left(1 + \left(b \cdot \color{blue}{\left(\frac{1}{2} \cdot b\right)} + b\right)\right) \]
                9. lower-fma.f64N/A

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

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot \frac{1}{2}}, b\right)\right) \]
                11. lower-*.f647.5

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot 0.5}, b\right)\right) \]
              8. Simplified7.5%

                \[\leadsto \log \left(1 + \color{blue}{\mathsf{fma}\left(b, b \cdot 0.5, b\right)}\right) \]
              9. Taylor expanded in b around 0

                \[\leadsto \color{blue}{b \cdot \left(1 + \frac{-1}{6} \cdot {b}^{2}\right)} \]
              10. Step-by-step derivation
                1. +-commutativeN/A

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

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

                  \[\leadsto \color{blue}{\left(b \cdot \frac{-1}{6}\right) \cdot {b}^{2}} + b \cdot 1 \]
                4. *-commutativeN/A

                  \[\leadsto \color{blue}{{b}^{2} \cdot \left(b \cdot \frac{-1}{6}\right)} + b \cdot 1 \]
                5. *-rgt-identityN/A

                  \[\leadsto {b}^{2} \cdot \left(b \cdot \frac{-1}{6}\right) + \color{blue}{b} \]
                6. lower-fma.f64N/A

                  \[\leadsto \color{blue}{\mathsf{fma}\left({b}^{2}, b \cdot \frac{-1}{6}, b\right)} \]
                7. unpow2N/A

                  \[\leadsto \mathsf{fma}\left(\color{blue}{b \cdot b}, b \cdot \frac{-1}{6}, b\right) \]
                8. lower-*.f64N/A

                  \[\leadsto \mathsf{fma}\left(\color{blue}{b \cdot b}, b \cdot \frac{-1}{6}, b\right) \]
                9. lower-*.f6495.7

                  \[\leadsto \mathsf{fma}\left(b \cdot b, \color{blue}{b \cdot -0.16666666666666666}, b\right) \]
              11. Simplified95.7%

                \[\leadsto \color{blue}{\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)} \]

              if 2.00000000000000012e-9 < (exp.f64 a)

              1. Initial program 66.8%

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

                \[\leadsto \log \left(e^{a} + \color{blue}{\left(1 + b\right)}\right) \]
              4. Step-by-step derivation
                1. lower-+.f6462.3

                  \[\leadsto \log \left(e^{a} + \color{blue}{\left(1 + b\right)}\right) \]
              5. Simplified62.3%

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

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

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

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

                  \[\leadsto \log \color{blue}{\left(1 + \left(e^{a} + b\right)\right)} \]
                5. lower-log1p.f64N/A

                  \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a} + b\right)} \]
                6. lower-+.f6462.3

                  \[\leadsto \mathsf{log1p}\left(\color{blue}{e^{a} + b}\right) \]
              7. Applied egg-rr62.3%

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

                \[\leadsto \mathsf{log1p}\left(\color{blue}{1 + b}\right) \]
              9. Step-by-step derivation
                1. lower-+.f6460.7

                  \[\leadsto \mathsf{log1p}\left(\color{blue}{1 + b}\right) \]
              10. Simplified60.7%

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

              \[\leadsto \begin{array}{l} \mathbf{if}\;e^{a} \leq 2 \cdot 10^{-9}:\\ \;\;\;\;\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)\\ \mathbf{else}:\\ \;\;\;\;\mathsf{log1p}\left(b + 1\right)\\ \end{array} \]
            5. Add Preprocessing

            Alternative 13: 94.9% accurate, 1.4× speedup?

            \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;e^{a} \leq 2 \cdot 10^{-9}:\\ \;\;\;\;\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)\\ \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 (<= (exp a) 2e-9)
               (fma (* b b) (* b -0.16666666666666666) b)
               (log (+ b 2.0))))
            assert(a < b);
            double code(double a, double b) {
            	double tmp;
            	if (exp(a) <= 2e-9) {
            		tmp = fma((b * b), (b * -0.16666666666666666), b);
            	} else {
            		tmp = log((b + 2.0));
            	}
            	return tmp;
            }
            
            a, b = sort([a, b])
            function code(a, b)
            	tmp = 0.0
            	if (exp(a) <= 2e-9)
            		tmp = fma(Float64(b * b), Float64(b * -0.16666666666666666), b);
            	else
            		tmp = log(Float64(b + 2.0));
            	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], 2e-9], N[(N[(b * b), $MachinePrecision] * N[(b * -0.16666666666666666), $MachinePrecision] + b), $MachinePrecision], N[Log[N[(b + 2.0), $MachinePrecision]], $MachinePrecision]]
            
            \begin{array}{l}
            [a, b] = \mathsf{sort}([a, b])\\
            \\
            \begin{array}{l}
            \mathbf{if}\;e^{a} \leq 2 \cdot 10^{-9}:\\
            \;\;\;\;\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)\\
            
            \mathbf{else}:\\
            \;\;\;\;\log \left(b + 2\right)\\
            
            
            \end{array}
            \end{array}
            
            Derivation
            1. Split input into 2 regimes
            2. if (exp.f64 a) < 2.00000000000000012e-9

              1. Initial program 9.0%

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

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

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

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

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

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

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot \frac{1}{2}} + 1, e^{a}\right)\right) \]
                6. lower-fma.f64N/A

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{\mathsf{fma}\left(b, \frac{1}{2}, 1\right)}, e^{a}\right)\right) \]
                7. lower-exp.f648.1

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.5, 1\right), \color{blue}{e^{a}}\right)\right) \]
              5. Simplified8.1%

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

                \[\leadsto \log \left(1 + \color{blue}{{b}^{2} \cdot \left(\frac{1}{2} + \frac{1}{b}\right)}\right) \]
              7. Step-by-step derivation
                1. distribute-lft-inN/A

                  \[\leadsto \log \left(1 + \color{blue}{\left({b}^{2} \cdot \frac{1}{2} + {b}^{2} \cdot \frac{1}{b}\right)}\right) \]
                2. unpow2N/A

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

                  \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + \color{blue}{b \cdot \left(b \cdot \frac{1}{b}\right)}\right)\right) \]
                4. rgt-mult-inverseN/A

                  \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + b \cdot \color{blue}{1}\right)\right) \]
                5. *-rgt-identityN/A

                  \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + \color{blue}{b}\right)\right) \]
                6. unpow2N/A

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

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

                  \[\leadsto \log \left(1 + \left(b \cdot \color{blue}{\left(\frac{1}{2} \cdot b\right)} + b\right)\right) \]
                9. lower-fma.f64N/A

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

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot \frac{1}{2}}, b\right)\right) \]
                11. lower-*.f647.5

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot 0.5}, b\right)\right) \]
              8. Simplified7.5%

                \[\leadsto \log \left(1 + \color{blue}{\mathsf{fma}\left(b, b \cdot 0.5, b\right)}\right) \]
              9. Taylor expanded in b around 0

                \[\leadsto \color{blue}{b \cdot \left(1 + \frac{-1}{6} \cdot {b}^{2}\right)} \]
              10. Step-by-step derivation
                1. +-commutativeN/A

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

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

                  \[\leadsto \color{blue}{\left(b \cdot \frac{-1}{6}\right) \cdot {b}^{2}} + b \cdot 1 \]
                4. *-commutativeN/A

                  \[\leadsto \color{blue}{{b}^{2} \cdot \left(b \cdot \frac{-1}{6}\right)} + b \cdot 1 \]
                5. *-rgt-identityN/A

                  \[\leadsto {b}^{2} \cdot \left(b \cdot \frac{-1}{6}\right) + \color{blue}{b} \]
                6. lower-fma.f64N/A

                  \[\leadsto \color{blue}{\mathsf{fma}\left({b}^{2}, b \cdot \frac{-1}{6}, b\right)} \]
                7. unpow2N/A

                  \[\leadsto \mathsf{fma}\left(\color{blue}{b \cdot b}, b \cdot \frac{-1}{6}, b\right) \]
                8. lower-*.f64N/A

                  \[\leadsto \mathsf{fma}\left(\color{blue}{b \cdot b}, b \cdot \frac{-1}{6}, b\right) \]
                9. lower-*.f6495.7

                  \[\leadsto \mathsf{fma}\left(b \cdot b, \color{blue}{b \cdot -0.16666666666666666}, b\right) \]
              11. Simplified95.7%

                \[\leadsto \color{blue}{\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)} \]

              if 2.00000000000000012e-9 < (exp.f64 a)

              1. Initial program 66.8%

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

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

                  \[\leadsto \log \color{blue}{\left(1 + e^{b}\right)} \]
                2. lower-exp.f6463.7

                  \[\leadsto \log \left(1 + \color{blue}{e^{b}}\right) \]
              5. Simplified63.7%

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

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

                  \[\leadsto \log \color{blue}{\left(b + 2\right)} \]
                2. lower-+.f6460.7

                  \[\leadsto \log \color{blue}{\left(b + 2\right)} \]
              8. Simplified60.7%

                \[\leadsto \log \color{blue}{\left(b + 2\right)} \]
            3. Recombined 2 regimes into one program.
            4. Add Preprocessing

            Alternative 14: 94.4% accurate, 1.5× speedup?

            \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \begin{array}{l} \mathbf{if}\;e^{a} \leq 2 \cdot 10^{-9}:\\ \;\;\;\;\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)\\ \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 (<= (exp a) 2e-9) (fma (* b b) (* b -0.16666666666666666) b) (log1p 1.0)))
            assert(a < b);
            double code(double a, double b) {
            	double tmp;
            	if (exp(a) <= 2e-9) {
            		tmp = fma((b * b), (b * -0.16666666666666666), b);
            	} else {
            		tmp = log1p(1.0);
            	}
            	return tmp;
            }
            
            a, b = sort([a, b])
            function code(a, b)
            	tmp = 0.0
            	if (exp(a) <= 2e-9)
            		tmp = fma(Float64(b * b), Float64(b * -0.16666666666666666), b);
            	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[N[Exp[a], $MachinePrecision], 2e-9], N[(N[(b * b), $MachinePrecision] * N[(b * -0.16666666666666666), $MachinePrecision] + b), $MachinePrecision], N[Log[1 + 1.0], $MachinePrecision]]
            
            \begin{array}{l}
            [a, b] = \mathsf{sort}([a, b])\\
            \\
            \begin{array}{l}
            \mathbf{if}\;e^{a} \leq 2 \cdot 10^{-9}:\\
            \;\;\;\;\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)\\
            
            \mathbf{else}:\\
            \;\;\;\;\mathsf{log1p}\left(1\right)\\
            
            
            \end{array}
            \end{array}
            
            Derivation
            1. Split input into 2 regimes
            2. if (exp.f64 a) < 2.00000000000000012e-9

              1. Initial program 9.0%

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

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

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

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

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

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

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot \frac{1}{2}} + 1, e^{a}\right)\right) \]
                6. lower-fma.f64N/A

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{\mathsf{fma}\left(b, \frac{1}{2}, 1\right)}, e^{a}\right)\right) \]
                7. lower-exp.f648.1

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.5, 1\right), \color{blue}{e^{a}}\right)\right) \]
              5. Simplified8.1%

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

                \[\leadsto \log \left(1 + \color{blue}{{b}^{2} \cdot \left(\frac{1}{2} + \frac{1}{b}\right)}\right) \]
              7. Step-by-step derivation
                1. distribute-lft-inN/A

                  \[\leadsto \log \left(1 + \color{blue}{\left({b}^{2} \cdot \frac{1}{2} + {b}^{2} \cdot \frac{1}{b}\right)}\right) \]
                2. unpow2N/A

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

                  \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + \color{blue}{b \cdot \left(b \cdot \frac{1}{b}\right)}\right)\right) \]
                4. rgt-mult-inverseN/A

                  \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + b \cdot \color{blue}{1}\right)\right) \]
                5. *-rgt-identityN/A

                  \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + \color{blue}{b}\right)\right) \]
                6. unpow2N/A

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

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

                  \[\leadsto \log \left(1 + \left(b \cdot \color{blue}{\left(\frac{1}{2} \cdot b\right)} + b\right)\right) \]
                9. lower-fma.f64N/A

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

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot \frac{1}{2}}, b\right)\right) \]
                11. lower-*.f647.5

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot 0.5}, b\right)\right) \]
              8. Simplified7.5%

                \[\leadsto \log \left(1 + \color{blue}{\mathsf{fma}\left(b, b \cdot 0.5, b\right)}\right) \]
              9. Taylor expanded in b around 0

                \[\leadsto \color{blue}{b \cdot \left(1 + \frac{-1}{6} \cdot {b}^{2}\right)} \]
              10. Step-by-step derivation
                1. +-commutativeN/A

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

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

                  \[\leadsto \color{blue}{\left(b \cdot \frac{-1}{6}\right) \cdot {b}^{2}} + b \cdot 1 \]
                4. *-commutativeN/A

                  \[\leadsto \color{blue}{{b}^{2} \cdot \left(b \cdot \frac{-1}{6}\right)} + b \cdot 1 \]
                5. *-rgt-identityN/A

                  \[\leadsto {b}^{2} \cdot \left(b \cdot \frac{-1}{6}\right) + \color{blue}{b} \]
                6. lower-fma.f64N/A

                  \[\leadsto \color{blue}{\mathsf{fma}\left({b}^{2}, b \cdot \frac{-1}{6}, b\right)} \]
                7. unpow2N/A

                  \[\leadsto \mathsf{fma}\left(\color{blue}{b \cdot b}, b \cdot \frac{-1}{6}, b\right) \]
                8. lower-*.f64N/A

                  \[\leadsto \mathsf{fma}\left(\color{blue}{b \cdot b}, b \cdot \frac{-1}{6}, b\right) \]
                9. lower-*.f6495.7

                  \[\leadsto \mathsf{fma}\left(b \cdot b, \color{blue}{b \cdot -0.16666666666666666}, b\right) \]
              11. Simplified95.7%

                \[\leadsto \color{blue}{\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)} \]

              if 2.00000000000000012e-9 < (exp.f64 a)

              1. Initial program 66.8%

                \[\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. lower-log1p.f64N/A

                  \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a}\right)} \]
                2. lower-exp.f6463.5

                  \[\leadsto \mathsf{log1p}\left(\color{blue}{e^{a}}\right) \]
              5. Simplified63.5%

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

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

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

              Alternative 15: 95.9% accurate, 1.5× speedup?

              \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \mathsf{log1p}\left(b + e^{a}\right) \end{array} \]
              NOTE: a and b should be sorted in increasing order before calling this function.
              (FPCore (a b) :precision binary64 (log1p (+ b (exp a))))
              assert(a < b);
              double code(double a, double b) {
              	return log1p((b + exp(a)));
              }
              
              assert a < b;
              public static double code(double a, double b) {
              	return Math.log1p((b + Math.exp(a)));
              }
              
              [a, b] = sort([a, b])
              def code(a, b):
              	return math.log1p((b + math.exp(a)))
              
              a, b = sort([a, b])
              function code(a, b)
              	return log1p(Float64(b + exp(a)))
              end
              
              NOTE: a and b should be sorted in increasing order before calling this function.
              code[a_, b_] := N[Log[1 + N[(b + N[Exp[a], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
              
              \begin{array}{l}
              [a, b] = \mathsf{sort}([a, b])\\
              \\
              \mathsf{log1p}\left(b + e^{a}\right)
              \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 \log \left(e^{a} + \color{blue}{\left(1 + b\right)}\right) \]
              4. Step-by-step derivation
                1. lower-+.f6448.6

                  \[\leadsto \log \left(e^{a} + \color{blue}{\left(1 + b\right)}\right) \]
              5. Simplified48.6%

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

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

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

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

                  \[\leadsto \log \color{blue}{\left(1 + \left(e^{a} + b\right)\right)} \]
                5. lower-log1p.f64N/A

                  \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a} + b\right)} \]
                6. lower-+.f6471.0

                  \[\leadsto \mathsf{log1p}\left(\color{blue}{e^{a} + b}\right) \]
              7. Applied egg-rr71.0%

                \[\leadsto \color{blue}{\mathsf{log1p}\left(e^{a} + b\right)} \]
              8. Final simplification71.0%

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

              Alternative 16: 50.2% accurate, 13.2× speedup?

              \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \mathsf{fma}\left(\mathsf{fma}\left(b, 0.125, -0.16666666666666666\right), b \cdot \left(b \cdot b\right), b\right) \end{array} \]
              NOTE: a and b should be sorted in increasing order before calling this function.
              (FPCore (a b)
               :precision binary64
               (fma (fma b 0.125 -0.16666666666666666) (* b (* b b)) b))
              assert(a < b);
              double code(double a, double b) {
              	return fma(fma(b, 0.125, -0.16666666666666666), (b * (b * b)), b);
              }
              
              a, b = sort([a, b])
              function code(a, b)
              	return fma(fma(b, 0.125, -0.16666666666666666), Float64(b * Float64(b * b)), b)
              end
              
              NOTE: a and b should be sorted in increasing order before calling this function.
              code[a_, b_] := N[(N[(b * 0.125 + -0.16666666666666666), $MachinePrecision] * N[(b * N[(b * b), $MachinePrecision]), $MachinePrecision] + b), $MachinePrecision]
              
              \begin{array}{l}
              [a, b] = \mathsf{sort}([a, b])\\
              \\
              \mathsf{fma}\left(\mathsf{fma}\left(b, 0.125, -0.16666666666666666\right), b \cdot \left(b \cdot b\right), b\right)
              \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 \log \color{blue}{\left(1 + \left(e^{a} + b \cdot \left(1 + \frac{1}{2} \cdot b\right)\right)\right)} \]
              4. Step-by-step derivation
                1. lower-+.f64N/A

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

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

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

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

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot \frac{1}{2}} + 1, e^{a}\right)\right) \]
                6. lower-fma.f64N/A

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{\mathsf{fma}\left(b, \frac{1}{2}, 1\right)}, e^{a}\right)\right) \]
                7. lower-exp.f6449.6

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.5, 1\right), \color{blue}{e^{a}}\right)\right) \]
              5. Simplified49.6%

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

                \[\leadsto \log \left(1 + \color{blue}{{b}^{2} \cdot \left(\frac{1}{2} + \frac{1}{b}\right)}\right) \]
              7. Step-by-step derivation
                1. distribute-lft-inN/A

                  \[\leadsto \log \left(1 + \color{blue}{\left({b}^{2} \cdot \frac{1}{2} + {b}^{2} \cdot \frac{1}{b}\right)}\right) \]
                2. unpow2N/A

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

                  \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + \color{blue}{b \cdot \left(b \cdot \frac{1}{b}\right)}\right)\right) \]
                4. rgt-mult-inverseN/A

                  \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + b \cdot \color{blue}{1}\right)\right) \]
                5. *-rgt-identityN/A

                  \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + \color{blue}{b}\right)\right) \]
                6. unpow2N/A

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

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

                  \[\leadsto \log \left(1 + \left(b \cdot \color{blue}{\left(\frac{1}{2} \cdot b\right)} + b\right)\right) \]
                9. lower-fma.f64N/A

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

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot \frac{1}{2}}, b\right)\right) \]
                11. lower-*.f644.3

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot 0.5}, b\right)\right) \]
              8. Simplified4.3%

                \[\leadsto \log \left(1 + \color{blue}{\mathsf{fma}\left(b, b \cdot 0.5, b\right)}\right) \]
              9. Taylor expanded in b around 0

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

                  \[\leadsto b \cdot \color{blue}{\left({b}^{2} \cdot \left(\frac{1}{8} \cdot b - \frac{1}{6}\right) + 1\right)} \]
                2. distribute-rgt-inN/A

                  \[\leadsto \color{blue}{\left({b}^{2} \cdot \left(\frac{1}{8} \cdot b - \frac{1}{6}\right)\right) \cdot b + 1 \cdot b} \]
                3. *-commutativeN/A

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

                  \[\leadsto \color{blue}{\left(\frac{1}{8} \cdot b - \frac{1}{6}\right) \cdot \left({b}^{2} \cdot b\right)} + 1 \cdot b \]
                5. unpow2N/A

                  \[\leadsto \left(\frac{1}{8} \cdot b - \frac{1}{6}\right) \cdot \left(\color{blue}{\left(b \cdot b\right)} \cdot b\right) + 1 \cdot b \]
                6. unpow3N/A

                  \[\leadsto \left(\frac{1}{8} \cdot b - \frac{1}{6}\right) \cdot \color{blue}{{b}^{3}} + 1 \cdot b \]
                7. *-lft-identityN/A

                  \[\leadsto \left(\frac{1}{8} \cdot b - \frac{1}{6}\right) \cdot {b}^{3} + \color{blue}{b} \]
                8. lower-fma.f64N/A

                  \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{1}{8} \cdot b - \frac{1}{6}, {b}^{3}, b\right)} \]
                9. sub-negN/A

                  \[\leadsto \mathsf{fma}\left(\color{blue}{\frac{1}{8} \cdot b + \left(\mathsf{neg}\left(\frac{1}{6}\right)\right)}, {b}^{3}, b\right) \]
                10. *-commutativeN/A

                  \[\leadsto \mathsf{fma}\left(\color{blue}{b \cdot \frac{1}{8}} + \left(\mathsf{neg}\left(\frac{1}{6}\right)\right), {b}^{3}, b\right) \]
                11. metadata-evalN/A

                  \[\leadsto \mathsf{fma}\left(b \cdot \frac{1}{8} + \color{blue}{\frac{-1}{6}}, {b}^{3}, b\right) \]
                12. lower-fma.f64N/A

                  \[\leadsto \mathsf{fma}\left(\color{blue}{\mathsf{fma}\left(b, \frac{1}{8}, \frac{-1}{6}\right)}, {b}^{3}, b\right) \]
                13. cube-multN/A

                  \[\leadsto \mathsf{fma}\left(\mathsf{fma}\left(b, \frac{1}{8}, \frac{-1}{6}\right), \color{blue}{b \cdot \left(b \cdot b\right)}, b\right) \]
                14. unpow2N/A

                  \[\leadsto \mathsf{fma}\left(\mathsf{fma}\left(b, \frac{1}{8}, \frac{-1}{6}\right), b \cdot \color{blue}{{b}^{2}}, b\right) \]
                15. lower-*.f64N/A

                  \[\leadsto \mathsf{fma}\left(\mathsf{fma}\left(b, \frac{1}{8}, \frac{-1}{6}\right), \color{blue}{b \cdot {b}^{2}}, b\right) \]
                16. unpow2N/A

                  \[\leadsto \mathsf{fma}\left(\mathsf{fma}\left(b, \frac{1}{8}, \frac{-1}{6}\right), b \cdot \color{blue}{\left(b \cdot b\right)}, b\right) \]
                17. lower-*.f6426.4

                  \[\leadsto \mathsf{fma}\left(\mathsf{fma}\left(b, 0.125, -0.16666666666666666\right), b \cdot \color{blue}{\left(b \cdot b\right)}, b\right) \]
              11. Simplified26.4%

                \[\leadsto \color{blue}{\mathsf{fma}\left(\mathsf{fma}\left(b, 0.125, -0.16666666666666666\right), b \cdot \left(b \cdot b\right), b\right)} \]
              12. Add Preprocessing

              Alternative 17: 50.0% accurate, 17.9× speedup?

              \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ \mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right) \end{array} \]
              NOTE: a and b should be sorted in increasing order before calling this function.
              (FPCore (a b) :precision binary64 (fma (* b b) (* b -0.16666666666666666) b))
              assert(a < b);
              double code(double a, double b) {
              	return fma((b * b), (b * -0.16666666666666666), b);
              }
              
              a, b = sort([a, b])
              function code(a, b)
              	return fma(Float64(b * b), Float64(b * -0.16666666666666666), b)
              end
              
              NOTE: a and b should be sorted in increasing order before calling this function.
              code[a_, b_] := N[(N[(b * b), $MachinePrecision] * N[(b * -0.16666666666666666), $MachinePrecision] + b), $MachinePrecision]
              
              \begin{array}{l}
              [a, b] = \mathsf{sort}([a, b])\\
              \\
              \mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)
              \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 \log \color{blue}{\left(1 + \left(e^{a} + b \cdot \left(1 + \frac{1}{2} \cdot b\right)\right)\right)} \]
              4. Step-by-step derivation
                1. lower-+.f64N/A

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

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

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

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

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot \frac{1}{2}} + 1, e^{a}\right)\right) \]
                6. lower-fma.f64N/A

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{\mathsf{fma}\left(b, \frac{1}{2}, 1\right)}, e^{a}\right)\right) \]
                7. lower-exp.f6449.6

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \mathsf{fma}\left(b, 0.5, 1\right), \color{blue}{e^{a}}\right)\right) \]
              5. Simplified49.6%

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

                \[\leadsto \log \left(1 + \color{blue}{{b}^{2} \cdot \left(\frac{1}{2} + \frac{1}{b}\right)}\right) \]
              7. Step-by-step derivation
                1. distribute-lft-inN/A

                  \[\leadsto \log \left(1 + \color{blue}{\left({b}^{2} \cdot \frac{1}{2} + {b}^{2} \cdot \frac{1}{b}\right)}\right) \]
                2. unpow2N/A

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

                  \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + \color{blue}{b \cdot \left(b \cdot \frac{1}{b}\right)}\right)\right) \]
                4. rgt-mult-inverseN/A

                  \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + b \cdot \color{blue}{1}\right)\right) \]
                5. *-rgt-identityN/A

                  \[\leadsto \log \left(1 + \left({b}^{2} \cdot \frac{1}{2} + \color{blue}{b}\right)\right) \]
                6. unpow2N/A

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

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

                  \[\leadsto \log \left(1 + \left(b \cdot \color{blue}{\left(\frac{1}{2} \cdot b\right)} + b\right)\right) \]
                9. lower-fma.f64N/A

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

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot \frac{1}{2}}, b\right)\right) \]
                11. lower-*.f644.3

                  \[\leadsto \log \left(1 + \mathsf{fma}\left(b, \color{blue}{b \cdot 0.5}, b\right)\right) \]
              8. Simplified4.3%

                \[\leadsto \log \left(1 + \color{blue}{\mathsf{fma}\left(b, b \cdot 0.5, b\right)}\right) \]
              9. Taylor expanded in b around 0

                \[\leadsto \color{blue}{b \cdot \left(1 + \frac{-1}{6} \cdot {b}^{2}\right)} \]
              10. Step-by-step derivation
                1. +-commutativeN/A

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

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

                  \[\leadsto \color{blue}{\left(b \cdot \frac{-1}{6}\right) \cdot {b}^{2}} + b \cdot 1 \]
                4. *-commutativeN/A

                  \[\leadsto \color{blue}{{b}^{2} \cdot \left(b \cdot \frac{-1}{6}\right)} + b \cdot 1 \]
                5. *-rgt-identityN/A

                  \[\leadsto {b}^{2} \cdot \left(b \cdot \frac{-1}{6}\right) + \color{blue}{b} \]
                6. lower-fma.f64N/A

                  \[\leadsto \color{blue}{\mathsf{fma}\left({b}^{2}, b \cdot \frac{-1}{6}, b\right)} \]
                7. unpow2N/A

                  \[\leadsto \mathsf{fma}\left(\color{blue}{b \cdot b}, b \cdot \frac{-1}{6}, b\right) \]
                8. lower-*.f64N/A

                  \[\leadsto \mathsf{fma}\left(\color{blue}{b \cdot b}, b \cdot \frac{-1}{6}, b\right) \]
                9. lower-*.f6426.4

                  \[\leadsto \mathsf{fma}\left(b \cdot b, \color{blue}{b \cdot -0.16666666666666666}, b\right) \]
              11. Simplified26.4%

                \[\leadsto \color{blue}{\mathsf{fma}\left(b \cdot b, b \cdot -0.16666666666666666, b\right)} \]
              12. Add Preprocessing

              Alternative 18: 12.0% accurate, 50.7× speedup?

              \[\begin{array}{l} [a, b] = \mathsf{sort}([a, b])\\ \\ b \cdot 0.5 \end{array} \]
              NOTE: a and b should be sorted in increasing order before calling this function.
              (FPCore (a b) :precision binary64 (* b 0.5))
              assert(a < b);
              double code(double a, double b) {
              	return b * 0.5;
              }
              
              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 * 0.5d0
              end function
              
              assert a < b;
              public static double code(double a, double b) {
              	return b * 0.5;
              }
              
              [a, b] = sort([a, b])
              def code(a, b):
              	return b * 0.5
              
              a, b = sort([a, b])
              function code(a, b)
              	return Float64(b * 0.5)
              end
              
              a, b = num2cell(sort([a, b])){:}
              function tmp = code(a, b)
              	tmp = b * 0.5;
              end
              
              NOTE: a and b should be sorted in increasing order before calling this function.
              code[a_, b_] := N[(b * 0.5), $MachinePrecision]
              
              \begin{array}{l}
              [a, b] = \mathsf{sort}([a, b])\\
              \\
              b \cdot 0.5
              \end{array}
              
              Derivation
              1. Initial program 52.4%

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

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

                  \[\leadsto \log \color{blue}{\left(1 + e^{b}\right)} \]
                2. lower-exp.f6448.7

                  \[\leadsto \log \left(1 + \color{blue}{e^{b}}\right) \]
              5. Simplified48.7%

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

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

                  \[\leadsto \color{blue}{\frac{1}{2} \cdot b + \log 2} \]
                2. *-commutativeN/A

                  \[\leadsto \color{blue}{b \cdot \frac{1}{2}} + \log 2 \]
                3. lower-fma.f64N/A

                  \[\leadsto \color{blue}{\mathsf{fma}\left(b, \frac{1}{2}, \log 2\right)} \]
                4. lower-log.f6447.2

                  \[\leadsto \mathsf{fma}\left(b, 0.5, \color{blue}{\log 2}\right) \]
              8. Simplified47.2%

                \[\leadsto \color{blue}{\mathsf{fma}\left(b, 0.5, \log 2\right)} \]
              9. Taylor expanded in b around inf

                \[\leadsto \color{blue}{\frac{1}{2} \cdot b} \]
              10. Step-by-step derivation
                1. *-commutativeN/A

                  \[\leadsto \color{blue}{b \cdot \frac{1}{2}} \]
                2. lower-*.f647.3

                  \[\leadsto \color{blue}{b \cdot 0.5} \]
              11. Simplified7.3%

                \[\leadsto \color{blue}{b \cdot 0.5} \]
              12. Add Preprocessing

              Reproduce

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