Download or view eBinarySplitting.frink in plain text format
// 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[1] + ln[2] + ... + ln[x]
k = 1
logFactorial = 0.
logMax = digits * ln[10]
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]
}
Download or view eBinarySplitting.frink in plain text format
This is a program written in the programming language Frink.
For more information, view the Frink
Documentation or see More Sample Frink Programs.
Alan Eliasen, eliasen@mindspring.com