# eBinarySplitting.frink

``` // Program to calculate e using binary splitting.  There is now a new library // e.frink which allows resumable calculations and caching of e.  This program // contains a simpler version of the algorithm for benchmarking and testing. // // See: //    http://numbers.computation.free.fr/Constants/Algorithms/splitting.html //    http://www.ginac.de/CLN/binsplit.pdf digits = 10000 if length[ARGS] >= 1    digits = eval[ARGS@0] // Find number of terms to calculate.  ln[x!] = ln + ln + ... + ln[x] k = 1 logFactorial = 0. logMax = digits * ln while (logFactorial < logMax) {    logFactorial = logFactorial + ln[k];    k = k + 1; } setPrecision[digits+3] //println["k=\$k"] s1 = now[] start = now[] p = P[0,k] q = Q[0,k] end = now[] println["Time spent in binary splitting: " + format[end-start, "s", 3]] start = now[] e = 1 + (1. * p)/q end = now[] println["Time spent in combining operations: " + format[end-start, "s", 3]] //println[e]                      // Rational number setPrecision[digits] start = now[] e = 1. * e end = now[] println["Time spent in floating-point conversion: " + format[end-start, "s", 3]] start = now[] es = toString[e] end = now[] println["Time spent in radix conversion: " + format[end-start, "s", 3]] println[e] e1 = now[] println["Total time spent:  " + format[e1-s1, "s", 3]] println[e] P[a,b] := {    if (b-a) == 1       return 1        m = (a+b) div 2    r = P[a,m] Q[m,b] + P[m,b]    return r } Q[a,b] := {    if (b-a) == 1       return b        m = (a+b) div 2    return Q[a,m] Q[m,b] } ```