C Programming Language

128 bit math

MS VC Developer Studio 2003.

I have some rather large integer numbers, 128 bits, I need to crunch. I need to be able to add, subtract, multiply, and divide. In no case would the result exceed 128 bits. Test for equal, greater than, less than.

I would use _int128 if it existed.

The values are currently in byte arrays such as:

unsigned char value[16];

arranged little endian (least significant first).

Anyone know of a quick and easy way to do this?

Thanks, Bruce.

"Bruce." <n@nowhere.com> writes: >MS VC Developer Studio 2003. >I have some rather large integer numbers, 128 bits, I need to crunch. I >need to be able to add, subtract, multiply, and divide. In no case would >the result exceed 128 bits. Test for equal, greater than, less than. >I would use _int128 if it existed. >The values are currently in byte arrays such as: >unsigned char value[16]; >arranged little endian (least significant first). >Anyone know of a quick and easy way to do this?

By treating the arrays as pairs of int64_t's ? When 64-bit machines were far less common, many used a library developed by Netscape to support 64-bit arithmetic using arrays of two 32-bit numbers. It was supported by a header file of prototypes and macros to account for endianness concerns. I suspect that much of that code could be reused for your application.

> By treating the arrays as pairs of int64_t's ? > When 64-bit machines were far less common, many used a library developed > by Netscape to support 64-bit arithmetic using arrays of two 32-bit > numbers. > It was supported by a header file of prototypes and macros to account for > endianness concerns. > I suspect that much of that code could be reused for your application.

Any idea where I might find that code?

Bruce.

Bruce. wrote: > MS VC Developer Studio 2003.

Please don't multi-post on Usenet. Cross-post if you think your question is really appropriate for more than one group.

> I have some rather large integer numbers, 128 bits, I need to crunch. I > need to be able to add, subtract, multiply, and divide. In no case would > the result exceed 128 bits. Test for equal, greater than, less than.

> I would use _int128 if it existed.

> The values are currently in byte arrays such as:

> unsigned char value[16];

> arranged little endian (least significant first).

> Anyone know of a quick and easy way to do this?

> Thanks, > Bruce.

Use lcc-win32, it provides 128 bit numbers in the standard distribution

> > I have some rather large integer numbers, 128 bits, I need to crunch. I > > need to be able to add, subtract, multiply, and divide. In no case would > > the result exceed 128 bits. Test for equal, greater than, less than.

> > I would use _int128 if it existed.

> > The values are currently in byte arrays such as:

> > unsigned char value[16];

> > arranged little endian (least significant first).

> > Anyone know of a quick and easy way to do this?

> > Thanks, > > Bruce.

> Use lcc-win32, it provides 128 bit numbers in the standard > distribution

Please try Intel 128 bit instruction(SSE /2/3) and 128 bit registers(XMM registers). You can use these instructions for 128 bit arithmetic. PADD*, PMUL* PSUB* etc are some of the instruction samples. Even AMD processors have these kind instructions. Please read the instructions manuals.

Use _asm block to right assembly in VC2003.

Thanks and regards, Amal P.

There is a library available called GMP. It allows you to deal with integers of arbitrary precision (reals and rationals too).

>> > I have some rather large integer numbers, 128 bits, I need to crunch. >> > I >> > need to be able to add, subtract, multiply, and divide. In no case >> > would >> > the result exceed 128 bits. Test for equal, greater than, less than.

>> > I would use _int128 if it existed.

>> > The values are currently in byte arrays such as:

>> > unsigned char value[16];

>> > arranged little endian (least significant first).

>> > Anyone know of a quick and easy way to do this?

>> > Thanks, >> > Bruce.

>> Use lcc-win32, it provides 128 bit numbers in the standard >> distribution