**[**Back to MATH SWAG index**]** **[**Back to Main SWAG index**]** **[**Original**]**

*{
Depending on the application, BCD may solve your problem. But if you
really need a _large_ binary integer you are going to have to use
multiple precision arithmetic. This is relatively easy to do in assembler
and just a little more difficult in a high-level language.
You need to define your _integer_ as an array of 256 bytes, 128 words,
or 64 unsigned long integers. So we're stuck with words. So our bigint
is an array[0..127] of word; We'll do it little-endian 0=least
significant word, 127 = most significant word. Using words with a longint
intermediate value actually makes our task a little easier.
}
***CONST **MaxBIG = 127;
**TYPE **tBigInt = **Array**[0..MaxBIG] **of **Word;
**PROCEDURE **BigAdd(**VAR **Op1, Op2: tBigInt);
*{ --------------------------------------------- }
{ Do multiprecision add: Op1 := Op1 + Op2 }
{ --------------------------------------------- }
***VAR **i: Integer;
Temp: Longint;
**Begin
**Temp := 0; *{ Clear carry }
***For **i := 0 **to **MaxBIG **Do Begin
**Temp := Longint(Op1[i]) + Op2[i] + Temp;
Op1[i] := Word(Temp);
Temp := Temp **shr **16; *{ Carry = High word }
***End**;
**END**;
**PROCEDURE **BigSub(**VAR **Op1, Op2: tBigInt);
*{ --------------------------------------------- }
{ Do multiprecision Substract: Op1 := Op1 - Op2 }
{ --------------------------------------------- }
***VAR **i: Integer;
Temp: Longint;
**Begin
**Temp := 0; *{ Clear carry }
***For **i := 0 **to **MaxBIG **Do Begin
**Temp := Longint(Op1[i]) - Op2[i] - Temp;
Op1[i] := Word(Temp);
Temp := Temp **shr **16; *{ Carry = High word }
***End**;
**END**;
I've done the easy part. It's your turn **to **put together
the multiprecision multiply **and **divide. **If **Op2 can be
an integer I'll toss together an op1*Op2 and Op1 div Op2.
But **for **a full version I'd have to crack the books :-)

**[**Back to MATH SWAG index**]** **[**Back to Main SWAG index**]** **[**Original**]**