--- Square Root Function:
This uses a binary approach involving only bit-shifting, addition and subtraction for greatest speed. The algorithm is based upon an abacus method described in a 1930's pamphlet, "Fundamental Operations in Bead Arithmetic" by C. C. Woo. It was then adapted to the C language in 1985 by Martin Guy. See "Methods of Computing Square Roots" in Wikipedia for additional details.
The input and output are 16-bits, but the internal computation is carried out at 32-bits. The returned value is accurate to two decimal places, with four exceptions at the very high end (4282, 4286, 4290 and 4294).
The maximum argument is 4294. There is no error detection; it is the duty of the calling program to see that the argument lies between 0 and 4294, inclusive.
--- Sine, Cosine and Tangent Functions
These functions are completely general: the arguments may be positive, negative or zero, in one degree increments. In other words, the domains for all three functions are -32768 to 32767 degrees. The values are completely accurate to two decimal places in all cases.
Keep in mind that tangent is not defined for 90 degrees, 270 degrees and all of their coterminal angles. It is the calling program's responsibility to avoid these.
Tables along with trigonometric identities are used.
--- Logarithmic Functions
These functions compute base 2, base e and base 10 logarithms accurate to +/- 0.01. The input arguments are words greater than zero. So, the domains in all cases are 1 to 65535.
A table driven approach with linear interpolation is used.
There are eight commands, including one to print out a fixed point result with the decimal point properly placed.
procedure F_write(number : integer);
write a fixed point number, decimal point two places from right
function F_log2(arg : word) : integer;
return base-2 logarithm rounded to 2 decimal places
function F_ln(arg : word) : integer;
return natural logarithm (base e) rounded to 2 decimal places
function F_log(arg : word) : integer;
return common logarithm (base 10) rounded to 2 decimal places
function F_sqrt(arg : word) : integer;
square root of a number from 0 to 4294 using abacus method
function F_sin(arg : integer) : integer;
return sine of angle given in degrees
function F_cos(arg : integer) : integer;
return cosine of angle given in degrees
function F_tan(arg : integer) : integer;
return tangent of angle given in degrees
Add It to Your Library Collection
Go fetch the library unit "FIXED_MATH.pas" for your setup now and store it in your Common directory.
Be sure to read over the source code for additional details on how to use it.
Try It Out
If you'd like to see it in operation, then head over to the exercises to find the mathematical functions exercise. Click here to go to it.