[Search for users] [Overall Top Noters] [List of all Conferences] [Download this site]

Conference rusure::math

Title:Mathematics at DEC
Moderator:RUSURE::EDP
Created:Mon Feb 03 1986
Last Modified:Fri Jun 06 1997
Last Successful Update:Fri Jun 06 1997
Number of topics:2083
Total number of notes:14613

87.0. "Algorithm for reciprocal" by HARE::STAN () Thu Jun 28 1984 02:47

From:	ROLL::USENET       "USENET Newsgroup Distributor" 13-JUN-1984 22:02
To:	HARE::STAN
Subj:	USENET net.math newsgroup articles

Newsgroups: net.math,net.wanted,att.wanted
Path: decwrl!decvax!mcnc!unc!ulysses!burl!geoff
Subject: need fast algorithm for reciprocal
Posted: Tue Jun 12 07:28:58 1984


I am working on a very primitive machine which lacks a division
operation.  What I really need is a reciprocal, so either type
algorithm would be fine.  I have shift, +,-, and *, as well as
logical operators, available.  I recall that IBM had an algorithm
many years ago which used multiplication to divide (sort of a binary
search -- multiply guess * number, compare to 1, adjust guess), but
I don't remember it well enough (my attempt at such an algorithm
required an avg of 20 iterations for reciprocals of numbers between 2
and 8000).

Any help from the net would be sincerely appreciated.

	thanks,
		geoff sherwood
		burl!geoff

	<"take care of the luxuries
		and the necessities take care
			of themselves">
T.RTitleUserPersonal
Name
DateLines
87.1HARE::STANThu Jun 28 1984 02:4730
From:	ROLL::USENET       "USENET Newsgroup Distributor" 14-JUN-1984 22:14
To:	HARE::STAN
Subj:	USENET net.math newsgroup articles

Newsgroups: net.math
Path: decwrl!decvax!cca!g-rh
Subject: Calculation of reciprocal without division
Posted: Wed Jun 13 00:02:33 1984


{
	A recent submission asked for a good algorithm for division,
given shift, multiply, and add instructions.  The following is an
efficient and simple algorithm:

	Suppose we have an approximation x to 1/N.  Then we have
xN = 1+e which can be written as 1/N = x/(1+e).  We have

	1/(1+e) = 1-e+e^2-e^3+e-4 ...
	        = (1-e)(1+e^2)(1+e^4)(1+e^8)...

An estimate for x which is correct to the first bit can be found
by shifting N.  This should be done so that xN lies in the range
[1/2,1].  The magnitude of the error term, e, is then bounded by
1/2.  Four terms in the product are required for 16 bit accuracy
and five for 32 bit accuracy.  The powers are formed by successive
squaring.  A number of refinements are possible; the best algorithm
for a particular machine will depend on the exact instruction set
available and their execution times.
}
87.2HARE::STANThu Jun 28 1984 02:4734
From:	ROLL::USENET       "USENET Newsgroup Distributor" 21-JUN-1984 22:04
To:	HARE::STAN
Subj:	USENET net.math newsgroup articles

Newsgroups: net.math
Path: decwrl!turtlevax!ken
Subject: Re: need fast algorithm for reciprocal
Posted: Wed Jun 20 11:36:15 1984


Suppose we want to calculate:			C = A / B.
This can be equivalently calculated as:		C = A * (1/B)
Consider the equation:				F(X) = (1/X) - B
The solution of:				F(X) = 0
is the reciprocal of B.

Use Newton's method to find the root:	X[i+1] = Xi - F(Xi)/F'(Xi)
					       = Xi - (1/Xi - B) / -Xi^2
					       = Xi(2 - B * Xi)

One can find the initial iterate, X0, from table lookup.  Convergence
is quadratic: i.e. the precision doubles with every iteration.  For
example, suppose the table lookup has 8 bits of accuracy; the first
iteration will produce 16 bits of accuracy, the second will produce 32.

The result will converge as long as the initial iterate, X0, is in the
range:

	0 < X0 < 2/B,		B > 0
	2/B < X0 < 0,		B < 0

-- 
Ken Turkowski @ CADLINC, Palo Alto, CA
UUCP: {amd70,decwrl,flairvax}!turtlevax!ken
87.3HARE::STANThu Jun 28 1984 02:4842
From:	ROLL::USENET       "USENET Newsgroup Distributor" 27-JUN-1984 22:09
To:	HARE::STAN
Subj:	USENET net.math newsgroup articles

Newsgroups: net.math
Path: decwrl!decvax!cca!ima!haddock!johna
Subject: Re: need fast algorithm for reciprocal - (nf)
Posted: Mon Jun 25 20:37:50 1984


#R:burl:-48000:haddock:13000001:000:902
haddock!johna    Jun 25 16:16:00 1984

The following is a division routine to divide 2 floating point numbers
that have up to 31 bit mantissas.  It uses only shifts, ORs, ANDs and
subtraction.

#define LO31BITS 0x7fffffff
#define BIT0 0x1
divide(dividend, divisor, quotient,
	 sign_dvd, sign_dvi, sign_quo, exp_dvd, exp_dvi, exp_quo)

	long dividend, divisor, quotient, sign_dvd, sign_dvi, sign_quo;
	long exp_dvd, exp_dvi, exp_quo;
{
	register short i;

	sign_quo = sign_dvd ^ sign_dvi;
	exp_quo  = exp_dvd - expdvi;
	quotient = 0;
	for (i=0; i<31; i++)
	{       quotient = (quotient << 1) & LO31BITS;          /* shift up */
		if (dividend >= divisor)                /* can we subtract? */
		{       dividend -= divisor;                  /* then do it */
			quotient |= BIT0;            /* set lo-order bit on */
		}
		dividend = (dividend << 1) & LO31BITS;          /* shift up */
	}
}

Hope this helps.
		      ...!cca!ima!haddock!johna
87.4METOO::YARBROUGHThu Jul 05 1984 15:3560





              AN ALGORITHM FOR EXTENDED PRECISION DIVISION

                  Lynn Yarbrough, Development Methods





In working on projects on the PDP-11 which require arithmetic processing

in  excess  of that provided by the -11 hardware, I have had occasion to

develop  some  extended-precision  capabilities.   In  particular,   the

problem   of   computing   the   quotient   and   remainder   when   one

(Extended-Precision,  or  EP)  integer  is  divided  by  another  is   a

challenge.



The following recursive algorithm for integer division has some pleasant

properties:   based  on primitive routines for EP addition, subtraction,

and comparison, the algorithm is quite short and  reasonably  fast  (its

speed  is  proportional to the length, L, of the arguments and the speed

of the other subroutines).  A surprising feature  of  the  algorithm  is

that it does not require the primitive operation of EP shifting.



The algorithm is mathematically based on the simple identity



        A/B = 2*(A/2B)



in which the multiplications on the right-hand side can be  computed  by

addition.   The  parenthesized term will, after at most L repetitions of

the doublings, become less than one;  at that  point,  the  quotient  is

zero and the remainder is the dividend.  In unwinding the recursion, 1's

are injected  into  the  quotient  as  required  and  the  remainder  is

correspondingly  reduced.   In  the  expression  of the algorithm on the

following page, the operations :=, +, -, and  the  relational  operators

are assumed to be applied to integers in EP representation.

                                                                  Page 2





PROCEDURE LONGDIV (A, B, QUO, REM):

! (Inputs: A, B; Outputs: QUO, REM.)

    BEGIN

    LOCAL QQ, RR;

    IF A < B

    THEN        ! (This always ends the recursion...)

        BEGIN                           

        QUO := 0;       ! EP constant Zero

        REM := A;

        END

    ELSE        ! (The two EP doublings follow:)

        BEGIN

        LONGDIV (A, B+B, QQ, RR);

        QUO := QQ+QQ;

        REM := RR;

        IF B <= RR

        THEN            ! The remainder is at most B too large and 

                        ! the quotient is one too small.

            BEGIN

            QUO := QUO + 1;     ! EP constant One.

            REM := REM - B;

            END;

        END;

    END.