2log (problem 3.3.6)

Percentage Accurate: 23.9% → 99.5%
Time: 9.6s
Alternatives: 11
Speedup: 17.3×

Specification

?
\[N > 1 \land N < 10^{+40}\]
\[\begin{array}{l} \\ \log \left(N + 1\right) - \log N \end{array} \]
(FPCore (N) :precision binary64 (- (log (+ N 1.0)) (log N)))
double code(double N) {
	return log((N + 1.0)) - log(N);
}
real(8) function code(n)
    real(8), intent (in) :: n
    code = log((n + 1.0d0)) - log(n)
end function
public static double code(double N) {
	return Math.log((N + 1.0)) - Math.log(N);
}
def code(N):
	return math.log((N + 1.0)) - math.log(N)
function code(N)
	return Float64(log(Float64(N + 1.0)) - log(N))
end
function tmp = code(N)
	tmp = log((N + 1.0)) - log(N);
end
code[N_] := N[(N[Log[N[(N + 1.0), $MachinePrecision]], $MachinePrecision] - N[Log[N], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}

\\
\log \left(N + 1\right) - \log N
\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 11 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: 23.9% accurate, 1.0× speedup?

\[\begin{array}{l} \\ \log \left(N + 1\right) - \log N \end{array} \]
(FPCore (N) :precision binary64 (- (log (+ N 1.0)) (log N)))
double code(double N) {
	return log((N + 1.0)) - log(N);
}
real(8) function code(n)
    real(8), intent (in) :: n
    code = log((n + 1.0d0)) - log(n)
end function
public static double code(double N) {
	return Math.log((N + 1.0)) - Math.log(N);
}
def code(N):
	return math.log((N + 1.0)) - math.log(N)
function code(N)
	return Float64(log(Float64(N + 1.0)) - log(N))
end
function tmp = code(N)
	tmp = log((N + 1.0)) - log(N);
end
code[N_] := N[(N[Log[N[(N + 1.0), $MachinePrecision]], $MachinePrecision] - N[Log[N], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}

\\
\log \left(N + 1\right) - \log N
\end{array}

Alternative 1: 99.5% accurate, 0.3× speedup?

\[\begin{array}{l} \\ \begin{array}{l} t_0 := \log \left(\frac{N}{N + 1}\right)\\ t_1 := {t\_0}^{2}\\ \mathbf{if}\;\log \left(N + 1\right) - \log N \leq 0.001:\\ \;\;\;\;\frac{1}{\mathsf{fma}\left(N, \frac{0.5 - \frac{\mathsf{fma}\left(N, 0.08333333333333333, -0.041666666666666664\right)}{N \cdot N}}{N}, N\right)}\\ \mathbf{else}:\\ \;\;\;\;\frac{t\_1}{t\_1 \cdot \frac{-1}{t\_0}}\\ \end{array} \end{array} \]
(FPCore (N)
 :precision binary64
 (let* ((t_0 (log (/ N (+ N 1.0)))) (t_1 (pow t_0 2.0)))
   (if (<= (- (log (+ N 1.0)) (log N)) 0.001)
     (/
      1.0
      (fma
       N
       (/
        (- 0.5 (/ (fma N 0.08333333333333333 -0.041666666666666664) (* N N)))
        N)
       N))
     (/ t_1 (* t_1 (/ -1.0 t_0))))))
double code(double N) {
	double t_0 = log((N / (N + 1.0)));
	double t_1 = pow(t_0, 2.0);
	double tmp;
	if ((log((N + 1.0)) - log(N)) <= 0.001) {
		tmp = 1.0 / fma(N, ((0.5 - (fma(N, 0.08333333333333333, -0.041666666666666664) / (N * N))) / N), N);
	} else {
		tmp = t_1 / (t_1 * (-1.0 / t_0));
	}
	return tmp;
}
function code(N)
	t_0 = log(Float64(N / Float64(N + 1.0)))
	t_1 = t_0 ^ 2.0
	tmp = 0.0
	if (Float64(log(Float64(N + 1.0)) - log(N)) <= 0.001)
		tmp = Float64(1.0 / fma(N, Float64(Float64(0.5 - Float64(fma(N, 0.08333333333333333, -0.041666666666666664) / Float64(N * N))) / N), N));
	else
		tmp = Float64(t_1 / Float64(t_1 * Float64(-1.0 / t_0)));
	end
	return tmp
end
code[N_] := Block[{t$95$0 = N[Log[N[(N / N[(N + 1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]}, Block[{t$95$1 = N[Power[t$95$0, 2.0], $MachinePrecision]}, If[LessEqual[N[(N[Log[N[(N + 1.0), $MachinePrecision]], $MachinePrecision] - N[Log[N], $MachinePrecision]), $MachinePrecision], 0.001], N[(1.0 / N[(N * N[(N[(0.5 - N[(N[(N * 0.08333333333333333 + -0.041666666666666664), $MachinePrecision] / N[(N * N), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N), $MachinePrecision] + N), $MachinePrecision]), $MachinePrecision], N[(t$95$1 / N[(t$95$1 * N[(-1.0 / t$95$0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]]
\begin{array}{l}

\\
\begin{array}{l}
t_0 := \log \left(\frac{N}{N + 1}\right)\\
t_1 := {t\_0}^{2}\\
\mathbf{if}\;\log \left(N + 1\right) - \log N \leq 0.001:\\
\;\;\;\;\frac{1}{\mathsf{fma}\left(N, \frac{0.5 - \frac{\mathsf{fma}\left(N, 0.08333333333333333, -0.041666666666666664\right)}{N \cdot N}}{N}, N\right)}\\

\mathbf{else}:\\
\;\;\;\;\frac{t\_1}{t\_1 \cdot \frac{-1}{t\_0}}\\


\end{array}
\end{array}
Derivation
  1. Split input into 2 regimes
  2. if (-.f64 (log.f64 (+.f64 N #s(literal 1 binary64))) (log.f64 N)) < 1e-3

    1. Initial program 19.4%

      \[\log \left(N + 1\right) - \log N \]
    2. Add Preprocessing
    3. Taylor expanded in N around inf

      \[\leadsto \color{blue}{\frac{\left(1 + \frac{\frac{1}{3}}{{N}^{2}}\right) - \left(\frac{1}{2} \cdot \frac{1}{N} + \frac{1}{4} \cdot \frac{1}{{N}^{3}}\right)}{N}} \]
    4. Applied rewrites99.6%

      \[\leadsto \color{blue}{\frac{1 + \frac{-0.5 - \frac{\frac{0.25}{N} + -0.3333333333333333}{N}}{N}}{N}} \]
    5. Step-by-step derivation
      1. Applied rewrites99.6%

        \[\leadsto \frac{1}{\color{blue}{\frac{N}{1 + \frac{-0.5 - \frac{\frac{0.25}{N} + -0.3333333333333333}{N}}{N}}}} \]
      2. Taylor expanded in N around -inf

        \[\leadsto \frac{1}{-1 \cdot \color{blue}{\left(N \cdot \left(-1 \cdot \frac{\frac{1}{2} + -1 \cdot \frac{\frac{1}{12} - \frac{1}{24} \cdot \frac{1}{N}}{N}}{N} - 1\right)\right)}} \]
      3. Step-by-step derivation
        1. Applied rewrites99.8%

          \[\leadsto \frac{1}{-\mathsf{fma}\left(N, \frac{0.5 - \frac{0.08333333333333333 + \frac{-0.041666666666666664}{N}}{N}}{-N}, -N\right)} \]
        2. Taylor expanded in N around -inf

          \[\leadsto \frac{1}{-1 \cdot \color{blue}{\left(N \cdot \left(-1 \cdot \frac{\frac{1}{2} + -1 \cdot \frac{\frac{1}{12} - \frac{1}{24} \cdot \frac{1}{N}}{N}}{N} - 1\right)\right)}} \]
        3. Applied rewrites99.8%

          \[\leadsto \frac{1}{\mathsf{fma}\left(N, \color{blue}{\frac{0.5 - \frac{\mathsf{fma}\left(N, 0.08333333333333333, -0.041666666666666664\right)}{N \cdot N}}{N}}, N\right)} \]

        if 1e-3 < (-.f64 (log.f64 (+.f64 N #s(literal 1 binary64))) (log.f64 N))

        1. Initial program 90.4%

          \[\log \left(N + 1\right) - \log N \]
        2. Add Preprocessing
        3. Step-by-step derivation
          1. lift--.f64N/A

            \[\leadsto \color{blue}{\log \left(N + 1\right) - \log N} \]
          2. lift-log.f64N/A

            \[\leadsto \color{blue}{\log \left(N + 1\right)} - \log N \]
          3. lift-log.f64N/A

            \[\leadsto \log \left(N + 1\right) - \color{blue}{\log N} \]
          4. diff-logN/A

            \[\leadsto \color{blue}{\log \left(\frac{N + 1}{N}\right)} \]
          5. clear-numN/A

            \[\leadsto \log \color{blue}{\left(\frac{1}{\frac{N}{N + 1}}\right)} \]
          6. neg-logN/A

            \[\leadsto \color{blue}{\mathsf{neg}\left(\log \left(\frac{N}{N + 1}\right)\right)} \]
          7. diff-logN/A

            \[\leadsto \mathsf{neg}\left(\color{blue}{\left(\log N - \log \left(N + 1\right)\right)}\right) \]
          8. lift-log.f64N/A

            \[\leadsto \mathsf{neg}\left(\left(\color{blue}{\log N} - \log \left(N + 1\right)\right)\right) \]
          9. lift-log.f64N/A

            \[\leadsto \mathsf{neg}\left(\left(\log N - \color{blue}{\log \left(N + 1\right)}\right)\right) \]
          10. lower-neg.f64N/A

            \[\leadsto \color{blue}{\mathsf{neg}\left(\left(\log N - \log \left(N + 1\right)\right)\right)} \]
          11. lift-log.f64N/A

            \[\leadsto \mathsf{neg}\left(\left(\color{blue}{\log N} - \log \left(N + 1\right)\right)\right) \]
          12. lift-log.f64N/A

            \[\leadsto \mathsf{neg}\left(\left(\log N - \color{blue}{\log \left(N + 1\right)}\right)\right) \]
          13. diff-logN/A

            \[\leadsto \mathsf{neg}\left(\color{blue}{\log \left(\frac{N}{N + 1}\right)}\right) \]
          14. lower-log.f64N/A

            \[\leadsto \mathsf{neg}\left(\color{blue}{\log \left(\frac{N}{N + 1}\right)}\right) \]
          15. lower-/.f6494.6

            \[\leadsto -\log \color{blue}{\left(\frac{N}{N + 1}\right)} \]
        4. Applied rewrites94.6%

          \[\leadsto \color{blue}{-\log \left(\frac{N}{N + 1}\right)} \]
        5. Step-by-step derivation
          1. lift-neg.f64N/A

            \[\leadsto \color{blue}{\mathsf{neg}\left(\log \left(\frac{N}{N + 1}\right)\right)} \]
          2. neg-sub0N/A

            \[\leadsto \color{blue}{0 - \log \left(\frac{N}{N + 1}\right)} \]
          3. flip--N/A

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

            \[\leadsto \frac{0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)}{\color{blue}{\log 1} + \log \left(\frac{N}{N + 1}\right)} \]
          5. lift-log.f64N/A

            \[\leadsto \frac{0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)}{\log 1 + \color{blue}{\log \left(\frac{N}{N + 1}\right)}} \]
          6. log-prodN/A

            \[\leadsto \frac{0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)}{\color{blue}{\log \left(1 \cdot \frac{N}{N + 1}\right)}} \]
          7. lift-/.f64N/A

            \[\leadsto \frac{0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)}{\log \left(1 \cdot \color{blue}{\frac{N}{N + 1}}\right)} \]
          8. clear-numN/A

            \[\leadsto \frac{0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)}{\log \left(1 \cdot \color{blue}{\frac{1}{\frac{N + 1}{N}}}\right)} \]
          9. div-invN/A

            \[\leadsto \frac{0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)}{\log \color{blue}{\left(\frac{1}{\frac{N + 1}{N}}\right)}} \]
          10. clear-numN/A

            \[\leadsto \frac{0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)}{\log \color{blue}{\left(\frac{N}{N + 1}\right)}} \]
          11. lift-/.f64N/A

            \[\leadsto \frac{0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)}{\log \color{blue}{\left(\frac{N}{N + 1}\right)}} \]
          12. lift-log.f64N/A

            \[\leadsto \frac{0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)}{\color{blue}{\log \left(\frac{N}{N + 1}\right)}} \]
          13. frac-2negN/A

            \[\leadsto \color{blue}{\frac{\mathsf{neg}\left(\left(0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)\right)\right)}{\mathsf{neg}\left(\log \left(\frac{N}{N + 1}\right)\right)}} \]
          14. lift-log.f64N/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)\right)\right)}{\mathsf{neg}\left(\color{blue}{\log \left(\frac{N}{N + 1}\right)}\right)} \]
          15. neg-logN/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)\right)\right)}{\color{blue}{\log \left(\frac{1}{\frac{N}{N + 1}}\right)}} \]
          16. lift-/.f64N/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)\right)\right)}{\log \left(\frac{1}{\color{blue}{\frac{N}{N + 1}}}\right)} \]
          17. clear-numN/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)\right)\right)}{\log \color{blue}{\left(\frac{N + 1}{N}\right)}} \]
          18. diff-logN/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)\right)\right)}{\color{blue}{\log \left(N + 1\right) - \log N}} \]
        6. Applied rewrites92.9%

          \[\leadsto \color{blue}{\frac{-\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)}{\log \left(\frac{N + 1}{N}\right)}} \]
        7. Step-by-step derivation
          1. lift-log.f64N/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\color{blue}{\log \left(\frac{N + 1}{N}\right)}} \]
          2. lift-/.f64N/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\log \color{blue}{\left(\frac{N + 1}{N}\right)}} \]
          3. clear-numN/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\log \color{blue}{\left(\frac{1}{\frac{N}{N + 1}}\right)}} \]
          4. lift-/.f64N/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\log \left(\frac{1}{\color{blue}{\frac{N}{N + 1}}}\right)} \]
          5. log-recN/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\color{blue}{\mathsf{neg}\left(\log \left(\frac{N}{N + 1}\right)\right)}} \]
          6. lift-log.f64N/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\mathsf{neg}\left(\color{blue}{\log \left(\frac{N}{N + 1}\right)}\right)} \]
          7. unpow1N/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\mathsf{neg}\left(\color{blue}{{\log \left(\frac{N}{N + 1}\right)}^{1}}\right)} \]
          8. metadata-evalN/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\mathsf{neg}\left({\log \left(\frac{N}{N + 1}\right)}^{\color{blue}{\left(2 - 1\right)}}\right)} \]
          9. pow-divN/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\mathsf{neg}\left(\color{blue}{\frac{{\log \left(\frac{N}{N + 1}\right)}^{2}}{{\log \left(\frac{N}{N + 1}\right)}^{1}}}\right)} \]
          10. lift-pow.f64N/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\mathsf{neg}\left(\frac{\color{blue}{{\log \left(\frac{N}{N + 1}\right)}^{2}}}{{\log \left(\frac{N}{N + 1}\right)}^{1}}\right)} \]
          11. unpow1N/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\mathsf{neg}\left(\frac{{\log \left(\frac{N}{N + 1}\right)}^{2}}{\color{blue}{\log \left(\frac{N}{N + 1}\right)}}\right)} \]
          12. frac-2negN/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\mathsf{neg}\left(\color{blue}{\frac{\mathsf{neg}\left({\log \left(\frac{N}{N + 1}\right)}^{2}\right)}{\mathsf{neg}\left(\log \left(\frac{N}{N + 1}\right)\right)}}\right)} \]
          13. lift-log.f64N/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\mathsf{neg}\left(\frac{\mathsf{neg}\left({\log \left(\frac{N}{N + 1}\right)}^{2}\right)}{\mathsf{neg}\left(\color{blue}{\log \left(\frac{N}{N + 1}\right)}\right)}\right)} \]
          14. log-recN/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\mathsf{neg}\left(\frac{\mathsf{neg}\left({\log \left(\frac{N}{N + 1}\right)}^{2}\right)}{\color{blue}{\log \left(\frac{1}{\frac{N}{N + 1}}\right)}}\right)} \]
          15. lift-/.f64N/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\mathsf{neg}\left(\frac{\mathsf{neg}\left({\log \left(\frac{N}{N + 1}\right)}^{2}\right)}{\log \left(\frac{1}{\color{blue}{\frac{N}{N + 1}}}\right)}\right)} \]
          16. clear-numN/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\mathsf{neg}\left(\frac{\mathsf{neg}\left({\log \left(\frac{N}{N + 1}\right)}^{2}\right)}{\log \color{blue}{\left(\frac{N + 1}{N}\right)}}\right)} \]
          17. diff-logN/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\mathsf{neg}\left(\frac{\mathsf{neg}\left({\log \left(\frac{N}{N + 1}\right)}^{2}\right)}{\color{blue}{\log \left(N + 1\right) - \log N}}\right)} \]
          18. lift-+.f64N/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\mathsf{neg}\left(\frac{\mathsf{neg}\left({\log \left(\frac{N}{N + 1}\right)}^{2}\right)}{\log \color{blue}{\left(N + 1\right)} - \log N}\right)} \]
        8. Applied rewrites94.8%

          \[\leadsto \frac{-\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)}{\color{blue}{\left(-{\log \left(\frac{N}{1 + N}\right)}^{2}\right) \cdot \frac{1}{\log \left(\frac{N}{1 + N}\right)}}} \]
      4. Recombined 2 regimes into one program.
      5. Final simplification99.4%

        \[\leadsto \begin{array}{l} \mathbf{if}\;\log \left(N + 1\right) - \log N \leq 0.001:\\ \;\;\;\;\frac{1}{\mathsf{fma}\left(N, \frac{0.5 - \frac{\mathsf{fma}\left(N, 0.08333333333333333, -0.041666666666666664\right)}{N \cdot N}}{N}, N\right)}\\ \mathbf{else}:\\ \;\;\;\;\frac{{\log \left(\frac{N}{N + 1}\right)}^{2}}{{\log \left(\frac{N}{N + 1}\right)}^{2} \cdot \frac{-1}{\log \left(\frac{N}{N + 1}\right)}}\\ \end{array} \]
      6. Add Preprocessing

      Alternative 2: 99.5% accurate, 0.6× speedup?

      \[\begin{array}{l} \\ \begin{array}{l} t_0 := \log \left(\frac{N}{N + 1}\right)\\ \mathbf{if}\;N \leq 1150:\\ \;\;\;\;-\frac{{t\_0}^{2}}{t\_0}\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{\mathsf{fma}\left(N, \frac{0.5 - \frac{\mathsf{fma}\left(N, 0.08333333333333333, -0.041666666666666664\right)}{N \cdot N}}{N}, N\right)}\\ \end{array} \end{array} \]
      (FPCore (N)
       :precision binary64
       (let* ((t_0 (log (/ N (+ N 1.0)))))
         (if (<= N 1150.0)
           (- (/ (pow t_0 2.0) t_0))
           (/
            1.0
            (fma
             N
             (/
              (- 0.5 (/ (fma N 0.08333333333333333 -0.041666666666666664) (* N N)))
              N)
             N)))))
      double code(double N) {
      	double t_0 = log((N / (N + 1.0)));
      	double tmp;
      	if (N <= 1150.0) {
      		tmp = -(pow(t_0, 2.0) / t_0);
      	} else {
      		tmp = 1.0 / fma(N, ((0.5 - (fma(N, 0.08333333333333333, -0.041666666666666664) / (N * N))) / N), N);
      	}
      	return tmp;
      }
      
      function code(N)
      	t_0 = log(Float64(N / Float64(N + 1.0)))
      	tmp = 0.0
      	if (N <= 1150.0)
      		tmp = Float64(-Float64((t_0 ^ 2.0) / t_0));
      	else
      		tmp = Float64(1.0 / fma(N, Float64(Float64(0.5 - Float64(fma(N, 0.08333333333333333, -0.041666666666666664) / Float64(N * N))) / N), N));
      	end
      	return tmp
      end
      
      code[N_] := Block[{t$95$0 = N[Log[N[(N / N[(N + 1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]}, If[LessEqual[N, 1150.0], (-N[(N[Power[t$95$0, 2.0], $MachinePrecision] / t$95$0), $MachinePrecision]), N[(1.0 / N[(N * N[(N[(0.5 - N[(N[(N * 0.08333333333333333 + -0.041666666666666664), $MachinePrecision] / N[(N * N), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N), $MachinePrecision] + N), $MachinePrecision]), $MachinePrecision]]]
      
      \begin{array}{l}
      
      \\
      \begin{array}{l}
      t_0 := \log \left(\frac{N}{N + 1}\right)\\
      \mathbf{if}\;N \leq 1150:\\
      \;\;\;\;-\frac{{t\_0}^{2}}{t\_0}\\
      
      \mathbf{else}:\\
      \;\;\;\;\frac{1}{\mathsf{fma}\left(N, \frac{0.5 - \frac{\mathsf{fma}\left(N, 0.08333333333333333, -0.041666666666666664\right)}{N \cdot N}}{N}, N\right)}\\
      
      
      \end{array}
      \end{array}
      
      Derivation
      1. Split input into 2 regimes
      2. if N < 1150

        1. Initial program 90.4%

          \[\log \left(N + 1\right) - \log N \]
        2. Add Preprocessing
        3. Step-by-step derivation
          1. lift--.f64N/A

            \[\leadsto \color{blue}{\log \left(N + 1\right) - \log N} \]
          2. lift-log.f64N/A

            \[\leadsto \color{blue}{\log \left(N + 1\right)} - \log N \]
          3. lift-log.f64N/A

            \[\leadsto \log \left(N + 1\right) - \color{blue}{\log N} \]
          4. diff-logN/A

            \[\leadsto \color{blue}{\log \left(\frac{N + 1}{N}\right)} \]
          5. clear-numN/A

            \[\leadsto \log \color{blue}{\left(\frac{1}{\frac{N}{N + 1}}\right)} \]
          6. neg-logN/A

            \[\leadsto \color{blue}{\mathsf{neg}\left(\log \left(\frac{N}{N + 1}\right)\right)} \]
          7. diff-logN/A

            \[\leadsto \mathsf{neg}\left(\color{blue}{\left(\log N - \log \left(N + 1\right)\right)}\right) \]
          8. lift-log.f64N/A

            \[\leadsto \mathsf{neg}\left(\left(\color{blue}{\log N} - \log \left(N + 1\right)\right)\right) \]
          9. lift-log.f64N/A

            \[\leadsto \mathsf{neg}\left(\left(\log N - \color{blue}{\log \left(N + 1\right)}\right)\right) \]
          10. lower-neg.f64N/A

            \[\leadsto \color{blue}{\mathsf{neg}\left(\left(\log N - \log \left(N + 1\right)\right)\right)} \]
          11. lift-log.f64N/A

            \[\leadsto \mathsf{neg}\left(\left(\color{blue}{\log N} - \log \left(N + 1\right)\right)\right) \]
          12. lift-log.f64N/A

            \[\leadsto \mathsf{neg}\left(\left(\log N - \color{blue}{\log \left(N + 1\right)}\right)\right) \]
          13. diff-logN/A

            \[\leadsto \mathsf{neg}\left(\color{blue}{\log \left(\frac{N}{N + 1}\right)}\right) \]
          14. lower-log.f64N/A

            \[\leadsto \mathsf{neg}\left(\color{blue}{\log \left(\frac{N}{N + 1}\right)}\right) \]
          15. lower-/.f6494.6

            \[\leadsto -\log \color{blue}{\left(\frac{N}{N + 1}\right)} \]
        4. Applied rewrites94.6%

          \[\leadsto \color{blue}{-\log \left(\frac{N}{N + 1}\right)} \]
        5. Step-by-step derivation
          1. lift-neg.f64N/A

            \[\leadsto \color{blue}{\mathsf{neg}\left(\log \left(\frac{N}{N + 1}\right)\right)} \]
          2. neg-sub0N/A

            \[\leadsto \color{blue}{0 - \log \left(\frac{N}{N + 1}\right)} \]
          3. flip--N/A

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

            \[\leadsto \frac{0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)}{\color{blue}{\log 1} + \log \left(\frac{N}{N + 1}\right)} \]
          5. lift-log.f64N/A

            \[\leadsto \frac{0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)}{\log 1 + \color{blue}{\log \left(\frac{N}{N + 1}\right)}} \]
          6. log-prodN/A

            \[\leadsto \frac{0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)}{\color{blue}{\log \left(1 \cdot \frac{N}{N + 1}\right)}} \]
          7. lift-/.f64N/A

            \[\leadsto \frac{0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)}{\log \left(1 \cdot \color{blue}{\frac{N}{N + 1}}\right)} \]
          8. clear-numN/A

            \[\leadsto \frac{0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)}{\log \left(1 \cdot \color{blue}{\frac{1}{\frac{N + 1}{N}}}\right)} \]
          9. div-invN/A

            \[\leadsto \frac{0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)}{\log \color{blue}{\left(\frac{1}{\frac{N + 1}{N}}\right)}} \]
          10. clear-numN/A

            \[\leadsto \frac{0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)}{\log \color{blue}{\left(\frac{N}{N + 1}\right)}} \]
          11. lift-/.f64N/A

            \[\leadsto \frac{0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)}{\log \color{blue}{\left(\frac{N}{N + 1}\right)}} \]
          12. lift-log.f64N/A

            \[\leadsto \frac{0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)}{\color{blue}{\log \left(\frac{N}{N + 1}\right)}} \]
          13. frac-2negN/A

            \[\leadsto \color{blue}{\frac{\mathsf{neg}\left(\left(0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)\right)\right)}{\mathsf{neg}\left(\log \left(\frac{N}{N + 1}\right)\right)}} \]
          14. lift-log.f64N/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)\right)\right)}{\mathsf{neg}\left(\color{blue}{\log \left(\frac{N}{N + 1}\right)}\right)} \]
          15. neg-logN/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)\right)\right)}{\color{blue}{\log \left(\frac{1}{\frac{N}{N + 1}}\right)}} \]
          16. lift-/.f64N/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)\right)\right)}{\log \left(\frac{1}{\color{blue}{\frac{N}{N + 1}}}\right)} \]
          17. clear-numN/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)\right)\right)}{\log \color{blue}{\left(\frac{N + 1}{N}\right)}} \]
          18. diff-logN/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 \cdot 0 - \log \left(\frac{N}{N + 1}\right) \cdot \log \left(\frac{N}{N + 1}\right)\right)\right)}{\color{blue}{\log \left(N + 1\right) - \log N}} \]
        6. Applied rewrites92.9%

          \[\leadsto \color{blue}{\frac{-\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)}{\log \left(\frac{N + 1}{N}\right)}} \]
        7. Step-by-step derivation
          1. lift-/.f64N/A

            \[\leadsto \color{blue}{\frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\log \left(\frac{N + 1}{N}\right)}} \]
          2. lift-neg.f64N/A

            \[\leadsto \frac{\color{blue}{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}}{\log \left(\frac{N + 1}{N}\right)} \]
          3. lift-log.f64N/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\color{blue}{\log \left(\frac{N + 1}{N}\right)}} \]
          4. lift-/.f64N/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\log \color{blue}{\left(\frac{N + 1}{N}\right)}} \]
          5. clear-numN/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\log \color{blue}{\left(\frac{1}{\frac{N}{N + 1}}\right)}} \]
          6. lift-/.f64N/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\log \left(\frac{1}{\color{blue}{\frac{N}{N + 1}}}\right)} \]
          7. log-recN/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\color{blue}{\mathsf{neg}\left(\log \left(\frac{N}{N + 1}\right)\right)}} \]
          8. lift-log.f64N/A

            \[\leadsto \frac{\mathsf{neg}\left(\left(0 - {\log \left(\frac{N}{N + 1}\right)}^{2}\right)\right)}{\mathsf{neg}\left(\color{blue}{\log \left(\frac{N}{N + 1}\right)}\right)} \]
          9. frac-2negN/A

            \[\leadsto \color{blue}{\frac{0 - {\log \left(\frac{N}{N + 1}\right)}^{2}}{\log \left(\frac{N}{N + 1}\right)}} \]
          10. lower-/.f6494.6

            \[\leadsto \color{blue}{\frac{0 - {\log \left(\frac{N}{N + 1}\right)}^{2}}{\log \left(\frac{N}{N + 1}\right)}} \]
          11. lift--.f64N/A

            \[\leadsto \frac{\color{blue}{0 - {\log \left(\frac{N}{N + 1}\right)}^{2}}}{\log \left(\frac{N}{N + 1}\right)} \]
          12. sub0-negN/A

            \[\leadsto \frac{\color{blue}{\mathsf{neg}\left({\log \left(\frac{N}{N + 1}\right)}^{2}\right)}}{\log \left(\frac{N}{N + 1}\right)} \]
          13. lower-neg.f6494.6

            \[\leadsto \frac{\color{blue}{-{\log \left(\frac{N}{N + 1}\right)}^{2}}}{\log \left(\frac{N}{N + 1}\right)} \]
          14. lift-+.f64N/A

            \[\leadsto \frac{\mathsf{neg}\left({\log \left(\frac{N}{\color{blue}{N + 1}}\right)}^{2}\right)}{\log \left(\frac{N}{N + 1}\right)} \]
          15. +-commutativeN/A

            \[\leadsto \frac{\mathsf{neg}\left({\log \left(\frac{N}{\color{blue}{1 + N}}\right)}^{2}\right)}{\log \left(\frac{N}{N + 1}\right)} \]
          16. lower-+.f6494.6

            \[\leadsto \frac{-{\log \left(\frac{N}{\color{blue}{1 + N}}\right)}^{2}}{\log \left(\frac{N}{N + 1}\right)} \]
          17. lift-+.f64N/A

            \[\leadsto \frac{\mathsf{neg}\left({\log \left(\frac{N}{1 + N}\right)}^{2}\right)}{\log \left(\frac{N}{\color{blue}{N + 1}}\right)} \]
          18. +-commutativeN/A

            \[\leadsto \frac{\mathsf{neg}\left({\log \left(\frac{N}{1 + N}\right)}^{2}\right)}{\log \left(\frac{N}{\color{blue}{1 + N}}\right)} \]
          19. lower-+.f6494.6

            \[\leadsto \frac{-{\log \left(\frac{N}{1 + N}\right)}^{2}}{\log \left(\frac{N}{\color{blue}{1 + N}}\right)} \]
        8. Applied rewrites94.6%

          \[\leadsto \color{blue}{\frac{-{\log \left(\frac{N}{1 + N}\right)}^{2}}{\log \left(\frac{N}{1 + N}\right)}} \]

        if 1150 < N

        1. Initial program 19.4%

          \[\log \left(N + 1\right) - \log N \]
        2. Add Preprocessing
        3. Taylor expanded in N around inf

          \[\leadsto \color{blue}{\frac{\left(1 + \frac{\frac{1}{3}}{{N}^{2}}\right) - \left(\frac{1}{2} \cdot \frac{1}{N} + \frac{1}{4} \cdot \frac{1}{{N}^{3}}\right)}{N}} \]
        4. Applied rewrites99.6%

          \[\leadsto \color{blue}{\frac{1 + \frac{-0.5 - \frac{\frac{0.25}{N} + -0.3333333333333333}{N}}{N}}{N}} \]
        5. Step-by-step derivation
          1. Applied rewrites99.6%

            \[\leadsto \frac{1}{\color{blue}{\frac{N}{1 + \frac{-0.5 - \frac{\frac{0.25}{N} + -0.3333333333333333}{N}}{N}}}} \]
          2. Taylor expanded in N around -inf

            \[\leadsto \frac{1}{-1 \cdot \color{blue}{\left(N \cdot \left(-1 \cdot \frac{\frac{1}{2} + -1 \cdot \frac{\frac{1}{12} - \frac{1}{24} \cdot \frac{1}{N}}{N}}{N} - 1\right)\right)}} \]
          3. Step-by-step derivation
            1. Applied rewrites99.8%

              \[\leadsto \frac{1}{-\mathsf{fma}\left(N, \frac{0.5 - \frac{0.08333333333333333 + \frac{-0.041666666666666664}{N}}{N}}{-N}, -N\right)} \]
            2. Taylor expanded in N around -inf

              \[\leadsto \frac{1}{-1 \cdot \color{blue}{\left(N \cdot \left(-1 \cdot \frac{\frac{1}{2} + -1 \cdot \frac{\frac{1}{12} - \frac{1}{24} \cdot \frac{1}{N}}{N}}{N} - 1\right)\right)}} \]
            3. Applied rewrites99.8%

              \[\leadsto \frac{1}{\mathsf{fma}\left(N, \color{blue}{\frac{0.5 - \frac{\mathsf{fma}\left(N, 0.08333333333333333, -0.041666666666666664\right)}{N \cdot N}}{N}}, N\right)} \]
          4. Recombined 2 regimes into one program.
          5. Final simplification99.4%

            \[\leadsto \begin{array}{l} \mathbf{if}\;N \leq 1150:\\ \;\;\;\;-\frac{{\log \left(\frac{N}{N + 1}\right)}^{2}}{\log \left(\frac{N}{N + 1}\right)}\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{\mathsf{fma}\left(N, \frac{0.5 - \frac{\mathsf{fma}\left(N, 0.08333333333333333, -0.041666666666666664\right)}{N \cdot N}}{N}, N\right)}\\ \end{array} \]
          6. Add Preprocessing

          Alternative 3: 99.5% accurate, 0.6× speedup?

          \[\begin{array}{l} \\ \begin{array}{l} \mathbf{if}\;\log \left(N + 1\right) - \log N \leq 0.001:\\ \;\;\;\;\frac{1}{\mathsf{fma}\left(N, \frac{0.5 - \frac{\mathsf{fma}\left(N, 0.08333333333333333, -0.041666666666666664\right)}{N \cdot N}}{N}, N\right)}\\ \mathbf{else}:\\ \;\;\;\;\log \left(\frac{N + 1}{N}\right)\\ \end{array} \end{array} \]
          (FPCore (N)
           :precision binary64
           (if (<= (- (log (+ N 1.0)) (log N)) 0.001)
             (/
              1.0
              (fma
               N
               (/
                (- 0.5 (/ (fma N 0.08333333333333333 -0.041666666666666664) (* N N)))
                N)
               N))
             (log (/ (+ N 1.0) N))))
          double code(double N) {
          	double tmp;
          	if ((log((N + 1.0)) - log(N)) <= 0.001) {
          		tmp = 1.0 / fma(N, ((0.5 - (fma(N, 0.08333333333333333, -0.041666666666666664) / (N * N))) / N), N);
          	} else {
          		tmp = log(((N + 1.0) / N));
          	}
          	return tmp;
          }
          
          function code(N)
          	tmp = 0.0
          	if (Float64(log(Float64(N + 1.0)) - log(N)) <= 0.001)
          		tmp = Float64(1.0 / fma(N, Float64(Float64(0.5 - Float64(fma(N, 0.08333333333333333, -0.041666666666666664) / Float64(N * N))) / N), N));
          	else
          		tmp = log(Float64(Float64(N + 1.0) / N));
          	end
          	return tmp
          end
          
          code[N_] := If[LessEqual[N[(N[Log[N[(N + 1.0), $MachinePrecision]], $MachinePrecision] - N[Log[N], $MachinePrecision]), $MachinePrecision], 0.001], N[(1.0 / N[(N * N[(N[(0.5 - N[(N[(N * 0.08333333333333333 + -0.041666666666666664), $MachinePrecision] / N[(N * N), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N), $MachinePrecision] + N), $MachinePrecision]), $MachinePrecision], N[Log[N[(N[(N + 1.0), $MachinePrecision] / N), $MachinePrecision]], $MachinePrecision]]
          
          \begin{array}{l}
          
          \\
          \begin{array}{l}
          \mathbf{if}\;\log \left(N + 1\right) - \log N \leq 0.001:\\
          \;\;\;\;\frac{1}{\mathsf{fma}\left(N, \frac{0.5 - \frac{\mathsf{fma}\left(N, 0.08333333333333333, -0.041666666666666664\right)}{N \cdot N}}{N}, N\right)}\\
          
          \mathbf{else}:\\
          \;\;\;\;\log \left(\frac{N + 1}{N}\right)\\
          
          
          \end{array}
          \end{array}
          
          Derivation
          1. Split input into 2 regimes
          2. if (-.f64 (log.f64 (+.f64 N #s(literal 1 binary64))) (log.f64 N)) < 1e-3

            1. Initial program 19.4%

              \[\log \left(N + 1\right) - \log N \]
            2. Add Preprocessing
            3. Taylor expanded in N around inf

              \[\leadsto \color{blue}{\frac{\left(1 + \frac{\frac{1}{3}}{{N}^{2}}\right) - \left(\frac{1}{2} \cdot \frac{1}{N} + \frac{1}{4} \cdot \frac{1}{{N}^{3}}\right)}{N}} \]
            4. Applied rewrites99.6%

              \[\leadsto \color{blue}{\frac{1 + \frac{-0.5 - \frac{\frac{0.25}{N} + -0.3333333333333333}{N}}{N}}{N}} \]
            5. Step-by-step derivation
              1. Applied rewrites99.6%

                \[\leadsto \frac{1}{\color{blue}{\frac{N}{1 + \frac{-0.5 - \frac{\frac{0.25}{N} + -0.3333333333333333}{N}}{N}}}} \]
              2. Taylor expanded in N around -inf

                \[\leadsto \frac{1}{-1 \cdot \color{blue}{\left(N \cdot \left(-1 \cdot \frac{\frac{1}{2} + -1 \cdot \frac{\frac{1}{12} - \frac{1}{24} \cdot \frac{1}{N}}{N}}{N} - 1\right)\right)}} \]
              3. Step-by-step derivation
                1. Applied rewrites99.8%

                  \[\leadsto \frac{1}{-\mathsf{fma}\left(N, \frac{0.5 - \frac{0.08333333333333333 + \frac{-0.041666666666666664}{N}}{N}}{-N}, -N\right)} \]
                2. Taylor expanded in N around -inf

                  \[\leadsto \frac{1}{-1 \cdot \color{blue}{\left(N \cdot \left(-1 \cdot \frac{\frac{1}{2} + -1 \cdot \frac{\frac{1}{12} - \frac{1}{24} \cdot \frac{1}{N}}{N}}{N} - 1\right)\right)}} \]
                3. Applied rewrites99.8%

                  \[\leadsto \frac{1}{\mathsf{fma}\left(N, \color{blue}{\frac{0.5 - \frac{\mathsf{fma}\left(N, 0.08333333333333333, -0.041666666666666664\right)}{N \cdot N}}{N}}, N\right)} \]

                if 1e-3 < (-.f64 (log.f64 (+.f64 N #s(literal 1 binary64))) (log.f64 N))

                1. Initial program 90.4%

                  \[\log \left(N + 1\right) - \log N \]
                2. Add Preprocessing
                3. Step-by-step derivation
                  1. lift--.f64N/A

                    \[\leadsto \color{blue}{\log \left(N + 1\right) - \log N} \]
                  2. lift-log.f64N/A

                    \[\leadsto \color{blue}{\log \left(N + 1\right)} - \log N \]
                  3. lift-log.f64N/A

                    \[\leadsto \log \left(N + 1\right) - \color{blue}{\log N} \]
                  4. diff-logN/A

                    \[\leadsto \color{blue}{\log \left(\frac{N + 1}{N}\right)} \]
                  5. lower-log.f64N/A

                    \[\leadsto \color{blue}{\log \left(\frac{N + 1}{N}\right)} \]
                  6. lower-/.f6493.4

                    \[\leadsto \log \color{blue}{\left(\frac{N + 1}{N}\right)} \]
                4. Applied rewrites93.4%

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

              Alternative 4: 99.5% accurate, 1.7× speedup?

              \[\begin{array}{l} \\ \begin{array}{l} \mathbf{if}\;N \leq 1150:\\ \;\;\;\;-\log \left(\frac{N}{N + 1}\right)\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{\mathsf{fma}\left(N, \frac{0.5 - \frac{\mathsf{fma}\left(N, 0.08333333333333333, -0.041666666666666664\right)}{N \cdot N}}{N}, N\right)}\\ \end{array} \end{array} \]
              (FPCore (N)
               :precision binary64
               (if (<= N 1150.0)
                 (- (log (/ N (+ N 1.0))))
                 (/
                  1.0
                  (fma
                   N
                   (/
                    (- 0.5 (/ (fma N 0.08333333333333333 -0.041666666666666664) (* N N)))
                    N)
                   N))))
              double code(double N) {
              	double tmp;
              	if (N <= 1150.0) {
              		tmp = -log((N / (N + 1.0)));
              	} else {
              		tmp = 1.0 / fma(N, ((0.5 - (fma(N, 0.08333333333333333, -0.041666666666666664) / (N * N))) / N), N);
              	}
              	return tmp;
              }
              
              function code(N)
              	tmp = 0.0
              	if (N <= 1150.0)
              		tmp = Float64(-log(Float64(N / Float64(N + 1.0))));
              	else
              		tmp = Float64(1.0 / fma(N, Float64(Float64(0.5 - Float64(fma(N, 0.08333333333333333, -0.041666666666666664) / Float64(N * N))) / N), N));
              	end
              	return tmp
              end
              
              code[N_] := If[LessEqual[N, 1150.0], (-N[Log[N[(N / N[(N + 1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), N[(1.0 / N[(N * N[(N[(0.5 - N[(N[(N * 0.08333333333333333 + -0.041666666666666664), $MachinePrecision] / N[(N * N), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N), $MachinePrecision] + N), $MachinePrecision]), $MachinePrecision]]
              
              \begin{array}{l}
              
              \\
              \begin{array}{l}
              \mathbf{if}\;N \leq 1150:\\
              \;\;\;\;-\log \left(\frac{N}{N + 1}\right)\\
              
              \mathbf{else}:\\
              \;\;\;\;\frac{1}{\mathsf{fma}\left(N, \frac{0.5 - \frac{\mathsf{fma}\left(N, 0.08333333333333333, -0.041666666666666664\right)}{N \cdot N}}{N}, N\right)}\\
              
              
              \end{array}
              \end{array}
              
              Derivation
              1. Split input into 2 regimes
              2. if N < 1150

                1. Initial program 90.4%

                  \[\log \left(N + 1\right) - \log N \]
                2. Add Preprocessing
                3. Step-by-step derivation
                  1. lift--.f64N/A

                    \[\leadsto \color{blue}{\log \left(N + 1\right) - \log N} \]
                  2. lift-log.f64N/A

                    \[\leadsto \color{blue}{\log \left(N + 1\right)} - \log N \]
                  3. lift-log.f64N/A

                    \[\leadsto \log \left(N + 1\right) - \color{blue}{\log N} \]
                  4. diff-logN/A

                    \[\leadsto \color{blue}{\log \left(\frac{N + 1}{N}\right)} \]
                  5. clear-numN/A

                    \[\leadsto \log \color{blue}{\left(\frac{1}{\frac{N}{N + 1}}\right)} \]
                  6. neg-logN/A

                    \[\leadsto \color{blue}{\mathsf{neg}\left(\log \left(\frac{N}{N + 1}\right)\right)} \]
                  7. diff-logN/A

                    \[\leadsto \mathsf{neg}\left(\color{blue}{\left(\log N - \log \left(N + 1\right)\right)}\right) \]
                  8. lift-log.f64N/A

                    \[\leadsto \mathsf{neg}\left(\left(\color{blue}{\log N} - \log \left(N + 1\right)\right)\right) \]
                  9. lift-log.f64N/A

                    \[\leadsto \mathsf{neg}\left(\left(\log N - \color{blue}{\log \left(N + 1\right)}\right)\right) \]
                  10. lower-neg.f64N/A

                    \[\leadsto \color{blue}{\mathsf{neg}\left(\left(\log N - \log \left(N + 1\right)\right)\right)} \]
                  11. lift-log.f64N/A

                    \[\leadsto \mathsf{neg}\left(\left(\color{blue}{\log N} - \log \left(N + 1\right)\right)\right) \]
                  12. lift-log.f64N/A

                    \[\leadsto \mathsf{neg}\left(\left(\log N - \color{blue}{\log \left(N + 1\right)}\right)\right) \]
                  13. diff-logN/A

                    \[\leadsto \mathsf{neg}\left(\color{blue}{\log \left(\frac{N}{N + 1}\right)}\right) \]
                  14. lower-log.f64N/A

                    \[\leadsto \mathsf{neg}\left(\color{blue}{\log \left(\frac{N}{N + 1}\right)}\right) \]
                  15. lower-/.f6494.6

                    \[\leadsto -\log \color{blue}{\left(\frac{N}{N + 1}\right)} \]
                4. Applied rewrites94.6%

                  \[\leadsto \color{blue}{-\log \left(\frac{N}{N + 1}\right)} \]

                if 1150 < N

                1. Initial program 19.4%

                  \[\log \left(N + 1\right) - \log N \]
                2. Add Preprocessing
                3. Taylor expanded in N around inf

                  \[\leadsto \color{blue}{\frac{\left(1 + \frac{\frac{1}{3}}{{N}^{2}}\right) - \left(\frac{1}{2} \cdot \frac{1}{N} + \frac{1}{4} \cdot \frac{1}{{N}^{3}}\right)}{N}} \]
                4. Applied rewrites99.6%

                  \[\leadsto \color{blue}{\frac{1 + \frac{-0.5 - \frac{\frac{0.25}{N} + -0.3333333333333333}{N}}{N}}{N}} \]
                5. Step-by-step derivation
                  1. Applied rewrites99.6%

                    \[\leadsto \frac{1}{\color{blue}{\frac{N}{1 + \frac{-0.5 - \frac{\frac{0.25}{N} + -0.3333333333333333}{N}}{N}}}} \]
                  2. Taylor expanded in N around -inf

                    \[\leadsto \frac{1}{-1 \cdot \color{blue}{\left(N \cdot \left(-1 \cdot \frac{\frac{1}{2} + -1 \cdot \frac{\frac{1}{12} - \frac{1}{24} \cdot \frac{1}{N}}{N}}{N} - 1\right)\right)}} \]
                  3. Step-by-step derivation
                    1. Applied rewrites99.8%

                      \[\leadsto \frac{1}{-\mathsf{fma}\left(N, \frac{0.5 - \frac{0.08333333333333333 + \frac{-0.041666666666666664}{N}}{N}}{-N}, -N\right)} \]
                    2. Taylor expanded in N around -inf

                      \[\leadsto \frac{1}{-1 \cdot \color{blue}{\left(N \cdot \left(-1 \cdot \frac{\frac{1}{2} + -1 \cdot \frac{\frac{1}{12} - \frac{1}{24} \cdot \frac{1}{N}}{N}}{N} - 1\right)\right)}} \]
                    3. Applied rewrites99.8%

                      \[\leadsto \frac{1}{\mathsf{fma}\left(N, \color{blue}{\frac{0.5 - \frac{\mathsf{fma}\left(N, 0.08333333333333333, -0.041666666666666664\right)}{N \cdot N}}{N}}, N\right)} \]
                  4. Recombined 2 regimes into one program.
                  5. Add Preprocessing

                  Alternative 5: 96.7% accurate, 3.8× speedup?

                  \[\begin{array}{l} \\ \frac{1}{\mathsf{fma}\left(N, \frac{0.5 - \frac{\mathsf{fma}\left(N, 0.08333333333333333, -0.041666666666666664\right)}{N \cdot N}}{N}, N\right)} \end{array} \]
                  (FPCore (N)
                   :precision binary64
                   (/
                    1.0
                    (fma
                     N
                     (/ (- 0.5 (/ (fma N 0.08333333333333333 -0.041666666666666664) (* N N))) N)
                     N)))
                  double code(double N) {
                  	return 1.0 / fma(N, ((0.5 - (fma(N, 0.08333333333333333, -0.041666666666666664) / (N * N))) / N), N);
                  }
                  
                  function code(N)
                  	return Float64(1.0 / fma(N, Float64(Float64(0.5 - Float64(fma(N, 0.08333333333333333, -0.041666666666666664) / Float64(N * N))) / N), N))
                  end
                  
                  code[N_] := N[(1.0 / N[(N * N[(N[(0.5 - N[(N[(N * 0.08333333333333333 + -0.041666666666666664), $MachinePrecision] / N[(N * N), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N), $MachinePrecision] + N), $MachinePrecision]), $MachinePrecision]
                  
                  \begin{array}{l}
                  
                  \\
                  \frac{1}{\mathsf{fma}\left(N, \frac{0.5 - \frac{\mathsf{fma}\left(N, 0.08333333333333333, -0.041666666666666664\right)}{N \cdot N}}{N}, N\right)}
                  \end{array}
                  
                  Derivation
                  1. Initial program 25.0%

                    \[\log \left(N + 1\right) - \log N \]
                  2. Add Preprocessing
                  3. Taylor expanded in N around inf

                    \[\leadsto \color{blue}{\frac{\left(1 + \frac{\frac{1}{3}}{{N}^{2}}\right) - \left(\frac{1}{2} \cdot \frac{1}{N} + \frac{1}{4} \cdot \frac{1}{{N}^{3}}\right)}{N}} \]
                  4. Applied rewrites96.3%

                    \[\leadsto \color{blue}{\frac{1 + \frac{-0.5 - \frac{\frac{0.25}{N} + -0.3333333333333333}{N}}{N}}{N}} \]
                  5. Step-by-step derivation
                    1. Applied rewrites96.3%

                      \[\leadsto \frac{1}{\color{blue}{\frac{N}{1 + \frac{-0.5 - \frac{\frac{0.25}{N} + -0.3333333333333333}{N}}{N}}}} \]
                    2. Taylor expanded in N around -inf

                      \[\leadsto \frac{1}{-1 \cdot \color{blue}{\left(N \cdot \left(-1 \cdot \frac{\frac{1}{2} + -1 \cdot \frac{\frac{1}{12} - \frac{1}{24} \cdot \frac{1}{N}}{N}}{N} - 1\right)\right)}} \]
                    3. Step-by-step derivation
                      1. Applied rewrites96.8%

                        \[\leadsto \frac{1}{-\mathsf{fma}\left(N, \frac{0.5 - \frac{0.08333333333333333 + \frac{-0.041666666666666664}{N}}{N}}{-N}, -N\right)} \]
                      2. Taylor expanded in N around -inf

                        \[\leadsto \frac{1}{-1 \cdot \color{blue}{\left(N \cdot \left(-1 \cdot \frac{\frac{1}{2} + -1 \cdot \frac{\frac{1}{12} - \frac{1}{24} \cdot \frac{1}{N}}{N}}{N} - 1\right)\right)}} \]
                      3. Applied rewrites96.8%

                        \[\leadsto \frac{1}{\mathsf{fma}\left(N, \color{blue}{\frac{0.5 - \frac{\mathsf{fma}\left(N, 0.08333333333333333, -0.041666666666666664\right)}{N \cdot N}}{N}}, N\right)} \]
                      4. Add Preprocessing

                      Alternative 6: 96.5% accurate, 4.8× speedup?

                      \[\begin{array}{l} \\ \frac{1}{\frac{\mathsf{fma}\left(N, \mathsf{fma}\left(N, N + 0.5, -0.08333333333333333\right), 0.041666666666666664\right)}{N \cdot N}} \end{array} \]
                      (FPCore (N)
                       :precision binary64
                       (/
                        1.0
                        (/
                         (fma N (fma N (+ N 0.5) -0.08333333333333333) 0.041666666666666664)
                         (* N N))))
                      double code(double N) {
                      	return 1.0 / (fma(N, fma(N, (N + 0.5), -0.08333333333333333), 0.041666666666666664) / (N * N));
                      }
                      
                      function code(N)
                      	return Float64(1.0 / Float64(fma(N, fma(N, Float64(N + 0.5), -0.08333333333333333), 0.041666666666666664) / Float64(N * N)))
                      end
                      
                      code[N_] := N[(1.0 / N[(N[(N * N[(N * N[(N + 0.5), $MachinePrecision] + -0.08333333333333333), $MachinePrecision] + 0.041666666666666664), $MachinePrecision] / N[(N * N), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
                      
                      \begin{array}{l}
                      
                      \\
                      \frac{1}{\frac{\mathsf{fma}\left(N, \mathsf{fma}\left(N, N + 0.5, -0.08333333333333333\right), 0.041666666666666664\right)}{N \cdot N}}
                      \end{array}
                      
                      Derivation
                      1. Initial program 25.0%

                        \[\log \left(N + 1\right) - \log N \]
                      2. Add Preprocessing
                      3. Taylor expanded in N around inf

                        \[\leadsto \color{blue}{\frac{\left(1 + \frac{\frac{1}{3}}{{N}^{2}}\right) - \left(\frac{1}{2} \cdot \frac{1}{N} + \frac{1}{4} \cdot \frac{1}{{N}^{3}}\right)}{N}} \]
                      4. Applied rewrites96.3%

                        \[\leadsto \color{blue}{\frac{1 + \frac{-0.5 - \frac{\frac{0.25}{N} + -0.3333333333333333}{N}}{N}}{N}} \]
                      5. Step-by-step derivation
                        1. Applied rewrites96.3%

                          \[\leadsto \frac{1}{\color{blue}{\frac{N}{1 + \frac{-0.5 - \frac{\frac{0.25}{N} + -0.3333333333333333}{N}}{N}}}} \]
                        2. Taylor expanded in N around -inf

                          \[\leadsto \frac{1}{-1 \cdot \color{blue}{\left(N \cdot \left(-1 \cdot \frac{\frac{1}{2} + -1 \cdot \frac{\frac{1}{12} - \frac{1}{24} \cdot \frac{1}{N}}{N}}{N} - 1\right)\right)}} \]
                        3. Step-by-step derivation
                          1. Applied rewrites96.8%

                            \[\leadsto \frac{1}{-\mathsf{fma}\left(N, \frac{0.5 - \frac{0.08333333333333333 + \frac{-0.041666666666666664}{N}}{N}}{-N}, -N\right)} \]
                          2. Taylor expanded in N around 0

                            \[\leadsto \frac{1}{\frac{\frac{1}{24} + N \cdot \left(N \cdot \left(\frac{1}{2} + N\right) - \frac{1}{12}\right)}{{N}^{\color{blue}{2}}}} \]
                          3. Step-by-step derivation
                            1. Applied rewrites96.6%

                              \[\leadsto \frac{1}{\frac{\mathsf{fma}\left(N, \mathsf{fma}\left(N, N + 0.5, -0.08333333333333333\right), 0.041666666666666664\right)}{N \cdot \color{blue}{N}}} \]
                            2. Add Preprocessing

                            Alternative 7: 95.6% accurate, 7.1× speedup?

                            \[\begin{array}{l} \\ \frac{1}{\left(N - -0.5\right) - \frac{0.08333333333333333}{N}} \end{array} \]
                            (FPCore (N)
                             :precision binary64
                             (/ 1.0 (- (- N -0.5) (/ 0.08333333333333333 N))))
                            double code(double N) {
                            	return 1.0 / ((N - -0.5) - (0.08333333333333333 / N));
                            }
                            
                            real(8) function code(n)
                                real(8), intent (in) :: n
                                code = 1.0d0 / ((n - (-0.5d0)) - (0.08333333333333333d0 / n))
                            end function
                            
                            public static double code(double N) {
                            	return 1.0 / ((N - -0.5) - (0.08333333333333333 / N));
                            }
                            
                            def code(N):
                            	return 1.0 / ((N - -0.5) - (0.08333333333333333 / N))
                            
                            function code(N)
                            	return Float64(1.0 / Float64(Float64(N - -0.5) - Float64(0.08333333333333333 / N)))
                            end
                            
                            function tmp = code(N)
                            	tmp = 1.0 / ((N - -0.5) - (0.08333333333333333 / N));
                            end
                            
                            code[N_] := N[(1.0 / N[(N[(N - -0.5), $MachinePrecision] - N[(0.08333333333333333 / N), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
                            
                            \begin{array}{l}
                            
                            \\
                            \frac{1}{\left(N - -0.5\right) - \frac{0.08333333333333333}{N}}
                            \end{array}
                            
                            Derivation
                            1. Initial program 25.0%

                              \[\log \left(N + 1\right) - \log N \]
                            2. Add Preprocessing
                            3. Taylor expanded in N around inf

                              \[\leadsto \color{blue}{\frac{\left(1 + \frac{\frac{1}{3}}{{N}^{2}}\right) - \left(\frac{1}{2} \cdot \frac{1}{N} + \frac{1}{4} \cdot \frac{1}{{N}^{3}}\right)}{N}} \]
                            4. Applied rewrites96.3%

                              \[\leadsto \color{blue}{\frac{1 + \frac{-0.5 - \frac{\frac{0.25}{N} + -0.3333333333333333}{N}}{N}}{N}} \]
                            5. Step-by-step derivation
                              1. Applied rewrites96.3%

                                \[\leadsto \frac{1}{\color{blue}{\frac{N}{1 + \frac{-0.5 - \frac{\frac{0.25}{N} + -0.3333333333333333}{N}}{N}}}} \]
                              2. Taylor expanded in N around -inf

                                \[\leadsto \frac{1}{-1 \cdot \color{blue}{\left(N \cdot \left(-1 \cdot \frac{\frac{1}{2} + -1 \cdot \frac{\frac{1}{12} - \frac{1}{24} \cdot \frac{1}{N}}{N}}{N} - 1\right)\right)}} \]
                              3. Step-by-step derivation
                                1. Applied rewrites96.8%

                                  \[\leadsto \frac{1}{-\mathsf{fma}\left(N, \frac{0.5 - \frac{0.08333333333333333 + \frac{-0.041666666666666664}{N}}{N}}{-N}, -N\right)} \]
                                2. Taylor expanded in N around inf

                                  \[\leadsto \frac{1}{N \cdot \color{blue}{\left(\left(1 + \frac{1}{2} \cdot \frac{1}{N}\right) - \frac{\frac{1}{12}}{{N}^{2}}\right)}} \]
                                3. Applied rewrites94.9%

                                  \[\leadsto \frac{1}{-\left(\frac{0.08333333333333333}{N} + \left(-0.5 - N\right)\right)} \]
                                4. Final simplification94.9%

                                  \[\leadsto \frac{1}{\left(N - -0.5\right) - \frac{0.08333333333333333}{N}} \]
                                5. Add Preprocessing

                                Alternative 8: 93.0% accurate, 7.1× speedup?

                                \[\begin{array}{l} \\ \frac{1}{\mathsf{fma}\left(N, \frac{0.5}{N}, N\right)} \end{array} \]
                                (FPCore (N) :precision binary64 (/ 1.0 (fma N (/ 0.5 N) N)))
                                double code(double N) {
                                	return 1.0 / fma(N, (0.5 / N), N);
                                }
                                
                                function code(N)
                                	return Float64(1.0 / fma(N, Float64(0.5 / N), N))
                                end
                                
                                code[N_] := N[(1.0 / N[(N * N[(0.5 / N), $MachinePrecision] + N), $MachinePrecision]), $MachinePrecision]
                                
                                \begin{array}{l}
                                
                                \\
                                \frac{1}{\mathsf{fma}\left(N, \frac{0.5}{N}, N\right)}
                                \end{array}
                                
                                Derivation
                                1. Initial program 25.0%

                                  \[\log \left(N + 1\right) - \log N \]
                                2. Add Preprocessing
                                3. Taylor expanded in N around inf

                                  \[\leadsto \color{blue}{\frac{\left(1 + \frac{\frac{1}{3}}{{N}^{2}}\right) - \left(\frac{1}{2} \cdot \frac{1}{N} + \frac{1}{4} \cdot \frac{1}{{N}^{3}}\right)}{N}} \]
                                4. Applied rewrites96.3%

                                  \[\leadsto \color{blue}{\frac{1 + \frac{-0.5 - \frac{\frac{0.25}{N} + -0.3333333333333333}{N}}{N}}{N}} \]
                                5. Step-by-step derivation
                                  1. Applied rewrites96.3%

                                    \[\leadsto \frac{1}{\color{blue}{\frac{N}{1 + \frac{-0.5 - \frac{\frac{0.25}{N} + -0.3333333333333333}{N}}{N}}}} \]
                                  2. Taylor expanded in N around inf

                                    \[\leadsto \frac{1}{N \cdot \color{blue}{\left(1 + \frac{1}{2} \cdot \frac{1}{N}\right)}} \]
                                  3. Step-by-step derivation
                                    1. Applied rewrites91.4%

                                      \[\leadsto \frac{1}{\mathsf{fma}\left(N, \color{blue}{\frac{0.5}{N}}, N\right)} \]
                                    2. Add Preprocessing

                                    Alternative 9: 93.0% accurate, 13.8× speedup?

                                    \[\begin{array}{l} \\ \frac{1}{N + 0.5} \end{array} \]
                                    (FPCore (N) :precision binary64 (/ 1.0 (+ N 0.5)))
                                    double code(double N) {
                                    	return 1.0 / (N + 0.5);
                                    }
                                    
                                    real(8) function code(n)
                                        real(8), intent (in) :: n
                                        code = 1.0d0 / (n + 0.5d0)
                                    end function
                                    
                                    public static double code(double N) {
                                    	return 1.0 / (N + 0.5);
                                    }
                                    
                                    def code(N):
                                    	return 1.0 / (N + 0.5)
                                    
                                    function code(N)
                                    	return Float64(1.0 / Float64(N + 0.5))
                                    end
                                    
                                    function tmp = code(N)
                                    	tmp = 1.0 / (N + 0.5);
                                    end
                                    
                                    code[N_] := N[(1.0 / N[(N + 0.5), $MachinePrecision]), $MachinePrecision]
                                    
                                    \begin{array}{l}
                                    
                                    \\
                                    \frac{1}{N + 0.5}
                                    \end{array}
                                    
                                    Derivation
                                    1. Initial program 25.0%

                                      \[\log \left(N + 1\right) - \log N \]
                                    2. Add Preprocessing
                                    3. Taylor expanded in N around inf

                                      \[\leadsto \color{blue}{\frac{\left(1 + \frac{\frac{1}{3}}{{N}^{2}}\right) - \left(\frac{1}{2} \cdot \frac{1}{N} + \frac{1}{4} \cdot \frac{1}{{N}^{3}}\right)}{N}} \]
                                    4. Applied rewrites96.3%

                                      \[\leadsto \color{blue}{\frac{1 + \frac{-0.5 - \frac{\frac{0.25}{N} + -0.3333333333333333}{N}}{N}}{N}} \]
                                    5. Step-by-step derivation
                                      1. Applied rewrites96.3%

                                        \[\leadsto \frac{1}{\color{blue}{\frac{N}{1 + \frac{-0.5 - \frac{\frac{0.25}{N} + -0.3333333333333333}{N}}{N}}}} \]
                                      2. Taylor expanded in N around -inf

                                        \[\leadsto \frac{1}{-1 \cdot \color{blue}{\left(N \cdot \left(-1 \cdot \frac{\frac{1}{2} + -1 \cdot \frac{\frac{1}{12} - \frac{1}{24} \cdot \frac{1}{N}}{N}}{N} - 1\right)\right)}} \]
                                      3. Step-by-step derivation
                                        1. Applied rewrites96.8%

                                          \[\leadsto \frac{1}{-\mathsf{fma}\left(N, \frac{0.5 - \frac{0.08333333333333333 + \frac{-0.041666666666666664}{N}}{N}}{-N}, -N\right)} \]
                                        2. Taylor expanded in N around inf

                                          \[\leadsto \frac{1}{N \cdot \color{blue}{\left(1 + \frac{1}{2} \cdot \frac{1}{N}\right)}} \]
                                        3. Step-by-step derivation
                                          1. Applied rewrites91.4%

                                            \[\leadsto \frac{1}{N + \color{blue}{0.5}} \]
                                          2. Add Preprocessing

                                          Alternative 10: 84.4% accurate, 17.3× speedup?

                                          \[\begin{array}{l} \\ \frac{1}{N} \end{array} \]
                                          (FPCore (N) :precision binary64 (/ 1.0 N))
                                          double code(double N) {
                                          	return 1.0 / N;
                                          }
                                          
                                          real(8) function code(n)
                                              real(8), intent (in) :: n
                                              code = 1.0d0 / n
                                          end function
                                          
                                          public static double code(double N) {
                                          	return 1.0 / N;
                                          }
                                          
                                          def code(N):
                                          	return 1.0 / N
                                          
                                          function code(N)
                                          	return Float64(1.0 / N)
                                          end
                                          
                                          function tmp = code(N)
                                          	tmp = 1.0 / N;
                                          end
                                          
                                          code[N_] := N[(1.0 / N), $MachinePrecision]
                                          
                                          \begin{array}{l}
                                          
                                          \\
                                          \frac{1}{N}
                                          \end{array}
                                          
                                          Derivation
                                          1. Initial program 25.0%

                                            \[\log \left(N + 1\right) - \log N \]
                                          2. Add Preprocessing
                                          3. Taylor expanded in N around inf

                                            \[\leadsto \color{blue}{\frac{1}{N}} \]
                                          4. Step-by-step derivation
                                            1. lower-/.f6483.3

                                              \[\leadsto \color{blue}{\frac{1}{N}} \]
                                          5. Applied rewrites83.3%

                                            \[\leadsto \color{blue}{\frac{1}{N}} \]
                                          6. Add Preprocessing

                                          Alternative 11: 3.3% accurate, 207.0× speedup?

                                          \[\begin{array}{l} \\ 0 \end{array} \]
                                          (FPCore (N) :precision binary64 0.0)
                                          double code(double N) {
                                          	return 0.0;
                                          }
                                          
                                          real(8) function code(n)
                                              real(8), intent (in) :: n
                                              code = 0.0d0
                                          end function
                                          
                                          public static double code(double N) {
                                          	return 0.0;
                                          }
                                          
                                          def code(N):
                                          	return 0.0
                                          
                                          function code(N)
                                          	return 0.0
                                          end
                                          
                                          function tmp = code(N)
                                          	tmp = 0.0;
                                          end
                                          
                                          code[N_] := 0.0
                                          
                                          \begin{array}{l}
                                          
                                          \\
                                          0
                                          \end{array}
                                          
                                          Derivation
                                          1. Initial program 25.0%

                                            \[\log \left(N + 1\right) - \log N \]
                                          2. Add Preprocessing
                                          3. Step-by-step derivation
                                            1. lift--.f64N/A

                                              \[\leadsto \color{blue}{\log \left(N + 1\right) - \log N} \]
                                            2. flip--N/A

                                              \[\leadsto \color{blue}{\frac{\log \left(N + 1\right) \cdot \log \left(N + 1\right) - \log N \cdot \log N}{\log \left(N + 1\right) + \log N}} \]
                                            3. div-subN/A

                                              \[\leadsto \color{blue}{\frac{\log \left(N + 1\right) \cdot \log \left(N + 1\right)}{\log \left(N + 1\right) + \log N} - \frac{\log N \cdot \log N}{\log \left(N + 1\right) + \log N}} \]
                                            4. sub-negN/A

                                              \[\leadsto \color{blue}{\frac{\log \left(N + 1\right) \cdot \log \left(N + 1\right)}{\log \left(N + 1\right) + \log N} + \left(\mathsf{neg}\left(\frac{\log N \cdot \log N}{\log \left(N + 1\right) + \log N}\right)\right)} \]
                                            5. associate-/l*N/A

                                              \[\leadsto \color{blue}{\log \left(N + 1\right) \cdot \frac{\log \left(N + 1\right)}{\log \left(N + 1\right) + \log N}} + \left(\mathsf{neg}\left(\frac{\log N \cdot \log N}{\log \left(N + 1\right) + \log N}\right)\right) \]
                                            6. lower-fma.f64N/A

                                              \[\leadsto \color{blue}{\mathsf{fma}\left(\log \left(N + 1\right), \frac{\log \left(N + 1\right)}{\log \left(N + 1\right) + \log N}, \mathsf{neg}\left(\frac{\log N \cdot \log N}{\log \left(N + 1\right) + \log N}\right)\right)} \]
                                          4. Applied rewrites25.0%

                                            \[\leadsto \color{blue}{\mathsf{fma}\left(\mathsf{log1p}\left(N\right), \frac{\mathsf{log1p}\left(N\right)}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}, -\frac{{\log N}^{2}}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}\right)} \]
                                          5. Step-by-step derivation
                                            1. lift-log1p.f64N/A

                                              \[\leadsto \mathsf{fma}\left(\color{blue}{\log \left(1 + N\right)}, \frac{\mathsf{log1p}\left(N\right)}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}, \mathsf{neg}\left(\frac{{\log N}^{2}}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}\right)\right) \]
                                            2. +-commutativeN/A

                                              \[\leadsto \mathsf{fma}\left(\log \color{blue}{\left(N + 1\right)}, \frac{\mathsf{log1p}\left(N\right)}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}, \mathsf{neg}\left(\frac{{\log N}^{2}}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}\right)\right) \]
                                            3. flip-+N/A

                                              \[\leadsto \mathsf{fma}\left(\log \color{blue}{\left(\frac{N \cdot N - 1 \cdot 1}{N - 1}\right)}, \frac{\mathsf{log1p}\left(N\right)}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}, \mathsf{neg}\left(\frac{{\log N}^{2}}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}\right)\right) \]
                                            4. log-divN/A

                                              \[\leadsto \mathsf{fma}\left(\color{blue}{\log \left(N \cdot N - 1 \cdot 1\right) - \log \left(N - 1\right)}, \frac{\mathsf{log1p}\left(N\right)}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}, \mathsf{neg}\left(\frac{{\log N}^{2}}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}\right)\right) \]
                                            5. lower--.f64N/A

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

                                              \[\leadsto \mathsf{fma}\left(\color{blue}{\log \left(N \cdot N - 1 \cdot 1\right)} - \log \left(N - 1\right), \frac{\mathsf{log1p}\left(N\right)}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}, \mathsf{neg}\left(\frac{{\log N}^{2}}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}\right)\right) \]
                                            7. metadata-evalN/A

                                              \[\leadsto \mathsf{fma}\left(\log \left(N \cdot N - \color{blue}{1}\right) - \log \left(N - 1\right), \frac{\mathsf{log1p}\left(N\right)}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}, \mathsf{neg}\left(\frac{{\log N}^{2}}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}\right)\right) \]
                                            8. sub-negN/A

                                              \[\leadsto \mathsf{fma}\left(\log \color{blue}{\left(N \cdot N + \left(\mathsf{neg}\left(1\right)\right)\right)} - \log \left(N - 1\right), \frac{\mathsf{log1p}\left(N\right)}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}, \mathsf{neg}\left(\frac{{\log N}^{2}}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}\right)\right) \]
                                            9. metadata-evalN/A

                                              \[\leadsto \mathsf{fma}\left(\log \left(N \cdot N + \color{blue}{-1}\right) - \log \left(N - 1\right), \frac{\mathsf{log1p}\left(N\right)}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}, \mathsf{neg}\left(\frac{{\log N}^{2}}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}\right)\right) \]
                                            10. lower-fma.f64N/A

                                              \[\leadsto \mathsf{fma}\left(\log \color{blue}{\left(\mathsf{fma}\left(N, N, -1\right)\right)} - \log \left(N - 1\right), \frac{\mathsf{log1p}\left(N\right)}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}, \mathsf{neg}\left(\frac{{\log N}^{2}}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}\right)\right) \]
                                            11. lower-log.f64N/A

                                              \[\leadsto \mathsf{fma}\left(\log \left(\mathsf{fma}\left(N, N, -1\right)\right) - \color{blue}{\log \left(N - 1\right)}, \frac{\mathsf{log1p}\left(N\right)}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}, \mathsf{neg}\left(\frac{{\log N}^{2}}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}\right)\right) \]
                                            12. sub-negN/A

                                              \[\leadsto \mathsf{fma}\left(\log \left(\mathsf{fma}\left(N, N, -1\right)\right) - \log \color{blue}{\left(N + \left(\mathsf{neg}\left(1\right)\right)\right)}, \frac{\mathsf{log1p}\left(N\right)}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}, \mathsf{neg}\left(\frac{{\log N}^{2}}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}\right)\right) \]
                                            13. metadata-evalN/A

                                              \[\leadsto \mathsf{fma}\left(\log \left(\mathsf{fma}\left(N, N, -1\right)\right) - \log \left(N + \color{blue}{-1}\right), \frac{\mathsf{log1p}\left(N\right)}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}, \mathsf{neg}\left(\frac{{\log N}^{2}}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}\right)\right) \]
                                            14. lower-+.f6425.3

                                              \[\leadsto \mathsf{fma}\left(\log \left(\mathsf{fma}\left(N, N, -1\right)\right) - \log \color{blue}{\left(N + -1\right)}, \frac{\mathsf{log1p}\left(N\right)}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}, -\frac{{\log N}^{2}}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}\right) \]
                                          6. Applied rewrites25.3%

                                            \[\leadsto \mathsf{fma}\left(\color{blue}{\log \left(\mathsf{fma}\left(N, N, -1\right)\right) - \log \left(N + -1\right)}, \frac{\mathsf{log1p}\left(N\right)}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}, -\frac{{\log N}^{2}}{\log \left(\mathsf{fma}\left(N, N, N\right)\right)}\right) \]
                                          7. Taylor expanded in N around inf

                                            \[\leadsto \color{blue}{\frac{1}{2} \cdot \left(-2 \cdot \log \left(\frac{1}{N}\right) - -1 \cdot \log \left(\frac{1}{N}\right)\right) - \frac{-1}{2} \cdot \log \left(\frac{1}{N}\right)} \]
                                          8. Step-by-step derivation
                                            1. distribute-rgt-out--N/A

                                              \[\leadsto \frac{1}{2} \cdot \color{blue}{\left(\log \left(\frac{1}{N}\right) \cdot \left(-2 - -1\right)\right)} - \frac{-1}{2} \cdot \log \left(\frac{1}{N}\right) \]
                                            2. metadata-evalN/A

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

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

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

                                              \[\leadsto \color{blue}{\frac{-1}{2}} \cdot \log \left(\frac{1}{N}\right) - \frac{-1}{2} \cdot \log \left(\frac{1}{N}\right) \]
                                            6. +-inverses3.3

                                              \[\leadsto \color{blue}{0} \]
                                          9. Applied rewrites3.3%

                                            \[\leadsto \color{blue}{0} \]
                                          10. Add Preprocessing

                                          Developer Target 1: 99.8% accurate, 1.8× speedup?

                                          \[\begin{array}{l} \\ \mathsf{log1p}\left(\frac{1}{N}\right) \end{array} \]
                                          (FPCore (N) :precision binary64 (log1p (/ 1.0 N)))
                                          double code(double N) {
                                          	return log1p((1.0 / N));
                                          }
                                          
                                          public static double code(double N) {
                                          	return Math.log1p((1.0 / N));
                                          }
                                          
                                          def code(N):
                                          	return math.log1p((1.0 / N))
                                          
                                          function code(N)
                                          	return log1p(Float64(1.0 / N))
                                          end
                                          
                                          code[N_] := N[Log[1 + N[(1.0 / N), $MachinePrecision]], $MachinePrecision]
                                          
                                          \begin{array}{l}
                                          
                                          \\
                                          \mathsf{log1p}\left(\frac{1}{N}\right)
                                          \end{array}
                                          

                                          Developer Target 2: 26.7% accurate, 1.8× speedup?

                                          \[\begin{array}{l} \\ \log \left(1 + \frac{1}{N}\right) \end{array} \]
                                          (FPCore (N) :precision binary64 (log (+ 1.0 (/ 1.0 N))))
                                          double code(double N) {
                                          	return log((1.0 + (1.0 / N)));
                                          }
                                          
                                          real(8) function code(n)
                                              real(8), intent (in) :: n
                                              code = log((1.0d0 + (1.0d0 / n)))
                                          end function
                                          
                                          public static double code(double N) {
                                          	return Math.log((1.0 + (1.0 / N)));
                                          }
                                          
                                          def code(N):
                                          	return math.log((1.0 + (1.0 / N)))
                                          
                                          function code(N)
                                          	return log(Float64(1.0 + Float64(1.0 / N)))
                                          end
                                          
                                          function tmp = code(N)
                                          	tmp = log((1.0 + (1.0 / N)));
                                          end
                                          
                                          code[N_] := N[Log[N[(1.0 + N[(1.0 / N), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
                                          
                                          \begin{array}{l}
                                          
                                          \\
                                          \log \left(1 + \frac{1}{N}\right)
                                          \end{array}
                                          

                                          Developer Target 3: 96.2% accurate, 0.6× speedup?

                                          \[\begin{array}{l} \\ \left(\left(\frac{1}{N} + \frac{-1}{2 \cdot {N}^{2}}\right) + \frac{1}{3 \cdot {N}^{3}}\right) + \frac{-1}{4 \cdot {N}^{4}} \end{array} \]
                                          (FPCore (N)
                                           :precision binary64
                                           (+
                                            (+ (+ (/ 1.0 N) (/ -1.0 (* 2.0 (pow N 2.0)))) (/ 1.0 (* 3.0 (pow N 3.0))))
                                            (/ -1.0 (* 4.0 (pow N 4.0)))))
                                          double code(double N) {
                                          	return (((1.0 / N) + (-1.0 / (2.0 * pow(N, 2.0)))) + (1.0 / (3.0 * pow(N, 3.0)))) + (-1.0 / (4.0 * pow(N, 4.0)));
                                          }
                                          
                                          real(8) function code(n)
                                              real(8), intent (in) :: n
                                              code = (((1.0d0 / n) + ((-1.0d0) / (2.0d0 * (n ** 2.0d0)))) + (1.0d0 / (3.0d0 * (n ** 3.0d0)))) + ((-1.0d0) / (4.0d0 * (n ** 4.0d0)))
                                          end function
                                          
                                          public static double code(double N) {
                                          	return (((1.0 / N) + (-1.0 / (2.0 * Math.pow(N, 2.0)))) + (1.0 / (3.0 * Math.pow(N, 3.0)))) + (-1.0 / (4.0 * Math.pow(N, 4.0)));
                                          }
                                          
                                          def code(N):
                                          	return (((1.0 / N) + (-1.0 / (2.0 * math.pow(N, 2.0)))) + (1.0 / (3.0 * math.pow(N, 3.0)))) + (-1.0 / (4.0 * math.pow(N, 4.0)))
                                          
                                          function code(N)
                                          	return Float64(Float64(Float64(Float64(1.0 / N) + Float64(-1.0 / Float64(2.0 * (N ^ 2.0)))) + Float64(1.0 / Float64(3.0 * (N ^ 3.0)))) + Float64(-1.0 / Float64(4.0 * (N ^ 4.0))))
                                          end
                                          
                                          function tmp = code(N)
                                          	tmp = (((1.0 / N) + (-1.0 / (2.0 * (N ^ 2.0)))) + (1.0 / (3.0 * (N ^ 3.0)))) + (-1.0 / (4.0 * (N ^ 4.0)));
                                          end
                                          
                                          code[N_] := N[(N[(N[(N[(1.0 / N), $MachinePrecision] + N[(-1.0 / N[(2.0 * N[Power[N, 2.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[(1.0 / N[(3.0 * N[Power[N, 3.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[(-1.0 / N[(4.0 * N[Power[N, 4.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
                                          
                                          \begin{array}{l}
                                          
                                          \\
                                          \left(\left(\frac{1}{N} + \frac{-1}{2 \cdot {N}^{2}}\right) + \frac{1}{3 \cdot {N}^{3}}\right) + \frac{-1}{4 \cdot {N}^{4}}
                                          \end{array}
                                          

                                          Reproduce

                                          ?
                                          herbie shell --seed 2024238 
                                          (FPCore (N)
                                            :name "2log (problem 3.3.6)"
                                            :precision binary64
                                            :pre (and (> N 1.0) (< N 1e+40))
                                          
                                            :alt
                                            (! :herbie-platform default (log1p (/ 1 N)))
                                          
                                            :alt
                                            (! :herbie-platform default (log (+ 1 (/ 1 N))))
                                          
                                            :alt
                                            (! :herbie-platform default (+ (/ 1 N) (/ -1 (* 2 (pow N 2))) (/ 1 (* 3 (pow N 3))) (/ -1 (* 4 (pow N 4)))))
                                          
                                            (- (log (+ N 1.0)) (log N)))