Reconsidering the original answer below, I find that taking square roots multiple times is far greater torture than dividing by the natural log of 10. So we are back to natural logs.
It is easy to calculate the natural log of a number that is sufficiently close to 1 by means of power series, continued fractions, or whatever you like. If your number is close to 1, then the natural log will be a small number, and multiplication by the natural log of 10 might be less of a headache. Of course, this does not cover the range of numbers you want; you must use RANGE REDUCTION. To do this, first calculate, by any means available, the base 10 logs of 1/0.5, 1/0.9, 1/0.99, and 1/0.999. Multiply your target number by these factors (easy on soroban because it is a shift and subtract), and accumulate the corresponding log on a second soroban with a couple of guard digits. That will get you down to the territory where $\frac{(x-1)}{(x+1)/2}$ takes care of the natural log of the remainder.
Another tool for range reduction is the square root. If you have an approximation that is not quite accurate enough, calculate Ln(Sqrt(x)) and double the result. Of course you best have a guard digit because you lose one bit of resolution when you double a number. On the other hand, if you have an approximation with a square root in it, and you can sacrifice some accuracy, calculate ln(x^2) and halve the result. This will remove square roots from your approximation. It is a tradeoff between work and accuracy.
Example: Log(2) = Log(1024)/10 = (3 + 0.4343 * Ln(1.024))/10 = 0.3 + 0.4343*0.024/1.012 = 0.3 + .010299960..., good enough for your table. Of course, for use in range reduction you will need another term in the power series for Ln(1.024). But if you multiply 1.024 by .99 a couple of times, you get 1.0036224, and Ln(1.024) = 2*Ln(1/0.99)+Ln(1.0026224). That last residue is approximated to 8 digits by 2*(x-1)/(x+1). Generation of the logs of 0.9, 0.99, and 0.999 to 8 digits may seem slow and laborious, but is is an investment that will pay back by simplifying all of the other logs.
==================================================================
Making a log table by pen and paper is not for the faint of heart; you must have perfect accuracy. I recommend pencil, eraser, and paper.
All of the above methods are great for natural logs, but to get logs to base 10, you must divide each by the natural log of 10. That's no fun. I would try to get logs to base ten directly by Euler's method of finding upper and lower bounds that have known logs, so you have an upper and lower bound for the log. Then bisect that interval for the logs by taking the arithmetic mean and for the argument by taking the geometric mean. You have to be quick and accurate at taking square roots like Euler.
You could build a table of certain logarithms: 10^(-1/2), 10^(-1/4), etc. Twenty such entries would allow you to calculate logs to 5 places by multiplying your target number by the appropriate power of ten and adding the negative of that log to the total. You could probably use two soroban: one for the division, and one to accumulate the log.
Another method is to square the argument, and if greater, divide by 10 if the result is greater than ten. When you divide by 10, append a binary 1 to the log (which is represented in binary), otherwise, append a binary 0. Knuth has a discussion of this in chapter 1 of Fundamental Algorithms and gives the breakdown of the squaring method as a problem for the student.
I would start with the first few prime numbers, then use those to build the logs of the other numbers. For a number x that you cannot factor, find a nearby number y that you can factor. Then calculate Ln(x/y) by a power series. A really good one is the Pade approximation Ln(x+1)=x(6+x)/(6+4x). The smaller x, the better the approximation. Then multiply this by the log(e) = .4342944819. Add that to the log of the nearby number, and you will have it. Of course it is helpful to memorize a few things to ten or more places. I would start with the logs of 2, e, 3, and 7. (The logs of 4, 5, 6, 8, and 9 can be computed from these).
There are some other marvelous Pade approximations using the transformation y = (x-1)/(x+1). The simple approximation Ln(x) = 2y is amazingly good, but with a Pade approximation like 2y*N(y)/D(y), where N and D are polynomials, you can do amazingly well. (but you still have to multiply the result by Log(e))
Another approach is one I got from Nate Grossman of UCLA. As you know, the arithmetic-geometric mean algorithm converges quadratically. Here is a variant:
a(0) = 1, g(0) = x, thereafter, a(1+j)=(a(j)+g(j))/2 and g(1+j)=sqrt(a(1+j)g(j))
Note the slight difference from the standard AGM formula. The a's and g's converge to a common limit, but not quadratically. You can use Richardson extrapolation to speed convergence. The limit is d, and (x-1)/d is your approximant for the natural log. This was a popular method in the Forth Interest Group. Also see Ron Doerfler's book, "Dead Reckoning".
Another method taught by Professor Grossman was Newton-Raphson solution of the exponential function. However that passes the buck to finding a fast efficient way to calculate the exponential.
Hope I gave you some ideas. Creative factoring can greatly extend the first few simple results. Interesting problem!
. . . Richard
Have fun!
bc
etc. As a computer scientist, I am probably biased here. – Raphael Sep 03 '11 at 10:36