2log (problem 3.3.6)

Percentage Accurate: 23.4% → 99.2%
Time: 7.9s
Alternatives: 10
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 10 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.4% 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.2% accurate, 0.4× speedup?

\[\begin{array}{l} \\ \begin{array}{l} \mathbf{if}\;\log \left(1 + N\right) - \log N \leq 0.0002:\\ \;\;\;\;\frac{1}{\mathsf{fma}\left(\frac{\frac{0.08333333333333333 - \frac{0.041666666666666664}{N}}{N} + -0.5}{N}, -N, N\right)}\\ \mathbf{else}:\\ \;\;\;\;e^{\log \log \left(\frac{\frac{\mathsf{fma}\left(N, N, -1\right)}{N}}{N - 1}\right)}\\ \end{array} \end{array} \]
(FPCore (N)
 :precision binary64
 (if (<= (- (log (+ 1.0 N)) (log N)) 0.0002)
   (/
    1.0
    (fma
     (/ (+ (/ (- 0.08333333333333333 (/ 0.041666666666666664 N)) N) -0.5) N)
     (- N)
     N))
   (exp (log (log (/ (/ (fma N N -1.0) N) (- N 1.0)))))))
double code(double N) {
	double tmp;
	if ((log((1.0 + N)) - log(N)) <= 0.0002) {
		tmp = 1.0 / fma(((((0.08333333333333333 - (0.041666666666666664 / N)) / N) + -0.5) / N), -N, N);
	} else {
		tmp = exp(log(log(((fma(N, N, -1.0) / N) / (N - 1.0)))));
	}
	return tmp;
}
function code(N)
	tmp = 0.0
	if (Float64(log(Float64(1.0 + N)) - log(N)) <= 0.0002)
		tmp = Float64(1.0 / fma(Float64(Float64(Float64(Float64(0.08333333333333333 - Float64(0.041666666666666664 / N)) / N) + -0.5) / N), Float64(-N), N));
	else
		tmp = exp(log(log(Float64(Float64(fma(N, N, -1.0) / N) / Float64(N - 1.0)))));
	end
	return tmp
end
code[N_] := If[LessEqual[N[(N[Log[N[(1.0 + N), $MachinePrecision]], $MachinePrecision] - N[Log[N], $MachinePrecision]), $MachinePrecision], 0.0002], N[(1.0 / N[(N[(N[(N[(N[(0.08333333333333333 - N[(0.041666666666666664 / N), $MachinePrecision]), $MachinePrecision] / N), $MachinePrecision] + -0.5), $MachinePrecision] / N), $MachinePrecision] * (-N) + N), $MachinePrecision]), $MachinePrecision], N[Exp[N[Log[N[Log[N[(N[(N[(N * N + -1.0), $MachinePrecision] / N), $MachinePrecision] / N[(N - 1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], $MachinePrecision]], $MachinePrecision]]
\begin{array}{l}

\\
\begin{array}{l}
\mathbf{if}\;\log \left(1 + N\right) - \log N \leq 0.0002:\\
\;\;\;\;\frac{1}{\mathsf{fma}\left(\frac{\frac{0.08333333333333333 - \frac{0.041666666666666664}{N}}{N} + -0.5}{N}, -N, N\right)}\\

\mathbf{else}:\\
\;\;\;\;e^{\log \log \left(\frac{\frac{\mathsf{fma}\left(N, N, -1\right)}{N}}{N - 1}\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)) < 2.0000000000000001e-4

    1. Initial program 15.7%

      \[\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.9%

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

        \[\leadsto \frac{1}{\color{blue}{\frac{N}{\frac{-0.5 - \frac{\frac{0.25}{N} - 0.3333333333333333}{N}}{N} - -1}}} \]
      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(\frac{0.5 - \frac{0.08333333333333333 - \frac{0.041666666666666664}{N}}{N}}{N}, -1, -1\right) \cdot \color{blue}{\left(-N\right)}} \]
        2. Step-by-step derivation
          1. Applied rewrites99.9%

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

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

          1. Initial program 92.7%

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

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

              \[\leadsto \log \left(\frac{\color{blue}{\frac{N \cdot N - 1 \cdot 1}{N - 1}}}{N}\right) \]
            7. associate-/l/N/A

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

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

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

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

              \[\leadsto -\color{blue}{\log \left(\frac{N \cdot \left(N - 1\right)}{N \cdot N - 1 \cdot 1}\right)} \]
            12. distribute-rgt-out--N/A

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

              \[\leadsto -\log \color{blue}{\left(\frac{N \cdot N - 1 \cdot N}{N \cdot N - 1 \cdot 1}\right)} \]
            14. distribute-rgt-out--N/A

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

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

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

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

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

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

              \[\leadsto -\log \left(\frac{\left(N - 1\right) \cdot N}{\color{blue}{\mathsf{fma}\left(N, N, \mathsf{neg}\left(1\right)\right)}}\right) \]
            21. metadata-eval93.1

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

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

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

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

              \[\leadsto \color{blue}{\log \left(\frac{1}{\frac{\left(N - 1\right) \cdot N}{\mathsf{fma}\left(N, N, -1\right)}}\right)} \]
            4. lift-/.f64N/A

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

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

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

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

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

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

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

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

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

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

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

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

              \[\leadsto \color{blue}{\mathsf{log1p}\left(N\right)} - \log N \]
            17. lift-log.f64N/A

              \[\leadsto \mathsf{log1p}\left(N\right) - \color{blue}{\log N} \]
            18. lift--.f6492.7

              \[\leadsto \color{blue}{\mathsf{log1p}\left(N\right) - \log N} \]
            19. rem-exp-logN/A

              \[\leadsto \color{blue}{e^{\log \left(\mathsf{log1p}\left(N\right) - \log N\right)}} \]
            20. lower-exp.f64N/A

              \[\leadsto \color{blue}{e^{\log \left(\mathsf{log1p}\left(N\right) - \log N\right)}} \]
          6. Applied rewrites92.7%

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

              \[\leadsto e^{\log \color{blue}{\left(\mathsf{log1p}\left(N\right) - \log N\right)}} \]
            2. lift-log1p.f64N/A

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

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

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

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

              \[\leadsto e^{\log \log \color{blue}{\left(\frac{1}{\frac{N}{N + 1}}\right)}} \]
            7. log-divN/A

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

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

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

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

              \[\leadsto e^{\log \left(0 - \left(\log N - \log \color{blue}{\left(\frac{N \cdot N - 1 \cdot 1}{N - 1}\right)}\right)\right)} \]
            12. log-divN/A

              \[\leadsto e^{\log \left(0 - \left(\log N - \color{blue}{\left(\log \left(N \cdot N - 1 \cdot 1\right) - \log \left(N - 1\right)\right)}\right)\right)} \]
            13. metadata-evalN/A

              \[\leadsto e^{\log \left(0 - \left(\log N - \left(\log \left(N \cdot N - \color{blue}{1}\right) - \log \left(N - 1\right)\right)\right)\right)} \]
            14. difference-of-sqr-1N/A

              \[\leadsto e^{\log \left(0 - \left(\log N - \left(\log \color{blue}{\left(\left(N + 1\right) \cdot \left(N - 1\right)\right)} - \log \left(N - 1\right)\right)\right)\right)} \]
            15. difference-of-sqr--1N/A

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

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

              \[\leadsto e^{\log \left(0 - \left(\left(\color{blue}{\log N} - \log \left(N \cdot N + -1\right)\right) + \log \left(N - 1\right)\right)\right)} \]
            18. log-divN/A

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

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

            \[\leadsto e^{\log \color{blue}{\log \left(\frac{\frac{\mathsf{fma}\left(N, N, -1\right)}{N}}{N - 1}\right)}} \]
        3. Recombined 2 regimes into one program.
        4. Final simplification99.6%

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

        Alternative 2: 99.3% accurate, 0.6× speedup?

        \[\begin{array}{l} \\ \begin{array}{l} \mathbf{if}\;\log \left(1 + N\right) - \log N \leq 0.0002:\\ \;\;\;\;\frac{1}{\mathsf{fma}\left(\frac{\frac{0.08333333333333333 - \frac{0.041666666666666664}{N}}{N} + -0.5}{N}, -N, N\right)}\\ \mathbf{else}:\\ \;\;\;\;\log \left(\frac{1}{N} + 1\right)\\ \end{array} \end{array} \]
        (FPCore (N)
         :precision binary64
         (if (<= (- (log (+ 1.0 N)) (log N)) 0.0002)
           (/
            1.0
            (fma
             (/ (+ (/ (- 0.08333333333333333 (/ 0.041666666666666664 N)) N) -0.5) N)
             (- N)
             N))
           (log (+ (/ 1.0 N) 1.0))))
        double code(double N) {
        	double tmp;
        	if ((log((1.0 + N)) - log(N)) <= 0.0002) {
        		tmp = 1.0 / fma(((((0.08333333333333333 - (0.041666666666666664 / N)) / N) + -0.5) / N), -N, N);
        	} else {
        		tmp = log(((1.0 / N) + 1.0));
        	}
        	return tmp;
        }
        
        function code(N)
        	tmp = 0.0
        	if (Float64(log(Float64(1.0 + N)) - log(N)) <= 0.0002)
        		tmp = Float64(1.0 / fma(Float64(Float64(Float64(Float64(0.08333333333333333 - Float64(0.041666666666666664 / N)) / N) + -0.5) / N), Float64(-N), N));
        	else
        		tmp = log(Float64(Float64(1.0 / N) + 1.0));
        	end
        	return tmp
        end
        
        code[N_] := If[LessEqual[N[(N[Log[N[(1.0 + N), $MachinePrecision]], $MachinePrecision] - N[Log[N], $MachinePrecision]), $MachinePrecision], 0.0002], N[(1.0 / N[(N[(N[(N[(N[(0.08333333333333333 - N[(0.041666666666666664 / N), $MachinePrecision]), $MachinePrecision] / N), $MachinePrecision] + -0.5), $MachinePrecision] / N), $MachinePrecision] * (-N) + N), $MachinePrecision]), $MachinePrecision], N[Log[N[(N[(1.0 / N), $MachinePrecision] + 1.0), $MachinePrecision]], $MachinePrecision]]
        
        \begin{array}{l}
        
        \\
        \begin{array}{l}
        \mathbf{if}\;\log \left(1 + N\right) - \log N \leq 0.0002:\\
        \;\;\;\;\frac{1}{\mathsf{fma}\left(\frac{\frac{0.08333333333333333 - \frac{0.041666666666666664}{N}}{N} + -0.5}{N}, -N, N\right)}\\
        
        \mathbf{else}:\\
        \;\;\;\;\log \left(\frac{1}{N} + 1\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)) < 2.0000000000000001e-4

          1. Initial program 15.7%

            \[\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.9%

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

              \[\leadsto \frac{1}{\color{blue}{\frac{N}{\frac{-0.5 - \frac{\frac{0.25}{N} - 0.3333333333333333}{N}}{N} - -1}}} \]
            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(\frac{0.5 - \frac{0.08333333333333333 - \frac{0.041666666666666664}{N}}{N}}{N}, -1, -1\right) \cdot \color{blue}{\left(-N\right)}} \]
              2. Step-by-step derivation
                1. Applied rewrites99.9%

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

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

                1. Initial program 92.7%

                  \[\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.8

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

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

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

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

                  \[\leadsto \color{blue}{\log \left(\frac{1 + N}{N}\right)} \]
                5. Taylor expanded in N around inf

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

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

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

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

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

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

              Alternative 3: 96.7% accurate, 3.5× speedup?

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

                \[\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 rewrites97.4%

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

                  \[\leadsto \frac{1}{\color{blue}{\frac{N}{\frac{-0.5 - \frac{\frac{0.25}{N} - 0.3333333333333333}{N}}{N} - -1}}} \]
                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 rewrites97.6%

                    \[\leadsto \frac{1}{\mathsf{fma}\left(\frac{0.5 - \frac{0.08333333333333333 - \frac{0.041666666666666664}{N}}{N}}{N}, -1, -1\right) \cdot \color{blue}{\left(-N\right)}} \]
                  2. Step-by-step derivation
                    1. Applied rewrites97.7%

                      \[\leadsto \frac{1}{\mathsf{fma}\left(\frac{-0.5 + \frac{0.08333333333333333 - \frac{0.041666666666666664}{N}}{N}}{N}, -N, N\right)} \]
                    2. Final simplification97.7%

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

                    Alternative 4: 96.6% accurate, 3.5× speedup?

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

                      \[\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 rewrites97.4%

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

                        \[\leadsto \frac{1}{\color{blue}{\frac{N}{\frac{-0.5 - \frac{\frac{0.25}{N} - 0.3333333333333333}{N}}{N} - -1}}} \]
                      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 rewrites97.6%

                          \[\leadsto \frac{1}{\mathsf{fma}\left(\frac{0.5 - \frac{0.08333333333333333 - \frac{0.041666666666666664}{N}}{N}}{N}, -1, -1\right) \cdot \color{blue}{\left(-N\right)}} \]
                        2. Step-by-step derivation
                          1. Applied rewrites97.6%

                            \[\leadsto \frac{1}{\left(1 + \frac{0.5 - \frac{0.08333333333333333 - \frac{0.041666666666666664}{N}}{N}}{N}\right) \cdot N} \]
                          2. Final simplification97.6%

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

                          Alternative 5: 96.5% accurate, 4.8× speedup?

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

                            \[\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 rewrites97.4%

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

                              \[\leadsto \frac{1}{\color{blue}{\frac{N}{\frac{-0.5 - \frac{\frac{0.25}{N} - 0.3333333333333333}{N}}{N} - -1}}} \]
                            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 rewrites97.6%

                                \[\leadsto \frac{1}{\mathsf{fma}\left(\frac{0.5 - \frac{0.08333333333333333 - \frac{0.041666666666666664}{N}}{N}}{N}, -1, -1\right) \cdot \color{blue}{\left(-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 rewrites97.6%

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

                                Alternative 6: 94.9% accurate, 5.2× speedup?

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

                                  \[\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) - \frac{1}{2} \cdot \frac{1}{N}}{N}} \]
                                4. Step-by-step derivation
                                  1. lower-/.f64N/A

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

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

                                    \[\leadsto \frac{\color{blue}{\left(\frac{\frac{1}{3}}{{N}^{2}} - \frac{1}{2} \cdot \frac{1}{N}\right) + 1}}{N} \]
                                  4. unpow2N/A

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

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

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

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

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

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

                                    \[\leadsto \frac{\color{blue}{\frac{\frac{1}{3} \cdot \frac{1}{N} - \frac{1}{2}}{N}} + 1}{N} \]
                                  11. metadata-evalN/A

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

                                    \[\leadsto \frac{\color{blue}{\frac{\frac{1}{3} \cdot \frac{1}{N} - \frac{1}{2}}{N} - -1}}{N} \]
                                  13. lower--.f64N/A

                                    \[\leadsto \frac{\color{blue}{\frac{\frac{1}{3} \cdot \frac{1}{N} - \frac{1}{2}}{N} - -1}}{N} \]
                                  14. lower-/.f64N/A

                                    \[\leadsto \frac{\color{blue}{\frac{\frac{1}{3} \cdot \frac{1}{N} - \frac{1}{2}}{N}} - -1}{N} \]
                                  15. lower--.f64N/A

                                    \[\leadsto \frac{\frac{\color{blue}{\frac{1}{3} \cdot \frac{1}{N} - \frac{1}{2}}}{N} - -1}{N} \]
                                  16. associate-*r/N/A

                                    \[\leadsto \frac{\frac{\color{blue}{\frac{\frac{1}{3} \cdot 1}{N}} - \frac{1}{2}}{N} - -1}{N} \]
                                  17. metadata-evalN/A

                                    \[\leadsto \frac{\frac{\frac{\color{blue}{\frac{1}{3}}}{N} - \frac{1}{2}}{N} - -1}{N} \]
                                  18. lower-/.f6496.5

                                    \[\leadsto \frac{\frac{\color{blue}{\frac{0.3333333333333333}{N}} - 0.5}{N} - -1}{N} \]
                                5. Applied rewrites96.5%

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

                                Alternative 7: 92.9% accurate, 7.1× speedup?

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

                                  \[\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 rewrites97.4%

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

                                    \[\leadsto \frac{1}{\color{blue}{\frac{N}{\frac{-0.5 - \frac{\frac{0.25}{N} - 0.3333333333333333}{N}}{N} - -1}}} \]
                                  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 rewrites94.7%

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

                                    Alternative 8: 92.3% accurate, 8.0× speedup?

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

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

                                      \[\leadsto \color{blue}{\frac{1 - \frac{1}{2} \cdot \frac{1}{N}}{N}} \]
                                    4. Step-by-step derivation
                                      1. lower-/.f64N/A

                                        \[\leadsto \color{blue}{\frac{1 - \frac{1}{2} \cdot \frac{1}{N}}{N}} \]
                                      2. lower--.f64N/A

                                        \[\leadsto \frac{\color{blue}{1 - \frac{1}{2} \cdot \frac{1}{N}}}{N} \]
                                      3. associate-*r/N/A

                                        \[\leadsto \frac{1 - \color{blue}{\frac{\frac{1}{2} \cdot 1}{N}}}{N} \]
                                      4. metadata-evalN/A

                                        \[\leadsto \frac{1 - \frac{\color{blue}{\frac{1}{2}}}{N}}{N} \]
                                      5. lower-/.f6494.2

                                        \[\leadsto \frac{1 - \color{blue}{\frac{0.5}{N}}}{N} \]
                                    5. Applied rewrites94.2%

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

                                    Alternative 9: 84.7% 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 20.2%

                                      \[\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-/.f6487.3

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

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

                                    Alternative 10: 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 20.2%

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

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

                                        \[\leadsto \log \left(\frac{\color{blue}{\frac{N \cdot N - 1 \cdot 1}{N - 1}}}{N}\right) \]
                                      7. associate-/l/N/A

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

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

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

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

                                        \[\leadsto -\color{blue}{\log \left(\frac{N \cdot \left(N - 1\right)}{N \cdot N - 1 \cdot 1}\right)} \]
                                      12. distribute-rgt-out--N/A

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

                                        \[\leadsto -\log \color{blue}{\left(\frac{N \cdot N - 1 \cdot N}{N \cdot N - 1 \cdot 1}\right)} \]
                                      14. distribute-rgt-out--N/A

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

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

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

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

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

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

                                        \[\leadsto -\log \left(\frac{\left(N - 1\right) \cdot N}{\color{blue}{\mathsf{fma}\left(N, N, \mathsf{neg}\left(1\right)\right)}}\right) \]
                                      21. metadata-eval22.7

                                        \[\leadsto -\log \left(\frac{\left(N - 1\right) \cdot N}{\mathsf{fma}\left(N, N, \color{blue}{-1}\right)}\right) \]
                                    4. Applied rewrites22.7%

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

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

                                        \[\leadsto -\log \color{blue}{\left(\frac{\left(N - 1\right) \cdot N}{\mathsf{fma}\left(N, N, -1\right)}\right)} \]
                                      3. lift-*.f64N/A

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

                                        \[\leadsto -\log \color{blue}{\left(\left(N - 1\right) \cdot \frac{N}{\mathsf{fma}\left(N, N, -1\right)}\right)} \]
                                      5. log-prodN/A

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

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

                                        \[\leadsto -\left(\color{blue}{{\log \left(N - 1\right)}^{1}} + \log \left(\frac{N}{\mathsf{fma}\left(N, N, -1\right)}\right)\right) \]
                                      8. sqr-powN/A

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

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

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

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

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

                                        \[\leadsto -\mathsf{fma}\left(\sqrt{\log \left(N - 1\right)}, {\log \left(N - 1\right)}^{\color{blue}{\frac{1}{2}}}, \log \left(\frac{N}{\mathsf{fma}\left(N, N, -1\right)}\right)\right) \]
                                      14. unpow1/2N/A

                                        \[\leadsto -\mathsf{fma}\left(\sqrt{\log \left(N - 1\right)}, \color{blue}{\sqrt{\log \left(N - 1\right)}}, \log \left(\frac{N}{\mathsf{fma}\left(N, N, -1\right)}\right)\right) \]
                                      15. lower-sqrt.f64N/A

                                        \[\leadsto -\mathsf{fma}\left(\sqrt{\log \left(N - 1\right)}, \color{blue}{\sqrt{\log \left(N - 1\right)}}, \log \left(\frac{N}{\mathsf{fma}\left(N, N, -1\right)}\right)\right) \]
                                      16. lower-log.f64N/A

                                        \[\leadsto -\mathsf{fma}\left(\sqrt{\log \left(N - 1\right)}, \sqrt{\log \left(N - 1\right)}, \color{blue}{\log \left(\frac{N}{\mathsf{fma}\left(N, N, -1\right)}\right)}\right) \]
                                      17. lift-fma.f64N/A

                                        \[\leadsto -\mathsf{fma}\left(\sqrt{\log \left(N - 1\right)}, \sqrt{\log \left(N - 1\right)}, \log \left(\frac{N}{\color{blue}{N \cdot N + -1}}\right)\right) \]
                                      18. metadata-evalN/A

                                        \[\leadsto -\mathsf{fma}\left(\sqrt{\log \left(N - 1\right)}, \sqrt{\log \left(N - 1\right)}, \log \left(\frac{N}{N \cdot N + \color{blue}{\left(\mathsf{neg}\left(1\right)\right)}}\right)\right) \]
                                      19. sub-negN/A

                                        \[\leadsto -\mathsf{fma}\left(\sqrt{\log \left(N - 1\right)}, \sqrt{\log \left(N - 1\right)}, \log \left(\frac{N}{\color{blue}{N \cdot N - 1}}\right)\right) \]
                                      20. metadata-evalN/A

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

                                        \[\leadsto -\mathsf{fma}\left(\sqrt{\log \left(N - 1\right)}, \sqrt{\log \left(N - 1\right)}, \log \color{blue}{\left(\frac{N}{N \cdot N - 1 \cdot 1}\right)}\right) \]
                                      22. metadata-evalN/A

                                        \[\leadsto -\mathsf{fma}\left(\sqrt{\log \left(N - 1\right)}, \sqrt{\log \left(N - 1\right)}, \log \left(\frac{N}{N \cdot N - \color{blue}{1}}\right)\right) \]
                                      23. sub-negN/A

                                        \[\leadsto -\mathsf{fma}\left(\sqrt{\log \left(N - 1\right)}, \sqrt{\log \left(N - 1\right)}, \log \left(\frac{N}{\color{blue}{N \cdot N + \left(\mathsf{neg}\left(1\right)\right)}}\right)\right) \]
                                    6. Applied rewrites21.3%

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

                                      \[\leadsto \color{blue}{-1 \cdot \left(\log \left(\frac{1}{N}\right) + -1 \cdot \log \left(\frac{1}{N}\right)\right)} \]
                                    8. Step-by-step derivation
                                      1. mul-1-negN/A

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

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

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

                                        \[\leadsto \mathsf{neg}\left(\color{blue}{0}\right) \]
                                      5. metadata-eval3.3

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

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

                                    Developer Target 1: 96.1% 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 2024259 
                                    (FPCore (N)
                                      :name "2log (problem 3.3.6)"
                                      :precision binary64
                                      :pre (and (> N 1.0) (< N 1e+40))
                                    
                                      :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)))