Can someone give me an example on how I can work with lets say a 100 bit number?
Using floats i know i can work with upto 80 bit numbers, but what if i have something larger, how do I perform calculations with those?
Posted on 2001-11-02 17:26:35 by Ray
In algorithms I have a post with a link to GMP. It's written in C/ASM for every platform but allows for high precision, such as 256 or custom defined precision (that I'm aware of). It's very fast and efficient and works with integers and floats and so on... it's freeware open source, that means free speach and free beer... as they say...


Thanks,
_Shawn
Posted on 2001-11-02 17:30:44 by _Shawn
Think about basic math...
Each DWORD becomes a unit, like each digit in a big number. If you can do 5 x 5 = 25, then you can do 5555 x 5555. It is no different when programming - break the problem into smaller pieces. Here is add:
AddBigNum PROC uses ebx, BigNum1:DWORD, BigNum2:DWORD, BigNumSize:DWORD

mov ecx,BigNumSize
mov ebx,BigNum2
mov edx,BigNum1
clc ;clear carry flag
@@: mov eax,[ebx + ecx * 4]
adc [edx + ecx * 4],eax
dec ecx ; doesn't effect carry flag
jns @B
ret
AddBigNum ENDP
I have a nice general multiply around somewhere, too? ;)
Posted on 2001-11-03 00:40:54 by bitRAKE
Shawn thanks for the link :alright:

bitrake,
i am testing the proc you wrote but it crashes. here is what i have:
push 2h
push 12345678h
push 0ABABABABh
call AddBigNum


push 0
call ExitProcess

;#############################################################################

AddBigNum PROC uses ebx, BigNum1:DWORD, BigNum2:DWORD, BigNumSize:DWORD
mov ecx,BigNumSize
mov ebx,BigNum2
mov edx,BigNum1
clc ;clear carry flag
@@: mov eax,
adc ,eax
dec ecx ; doesn't effect carry flag
jns @B
ret
AddBigNum ENDP
;#############################################################################


it crashes at the command mov eax, because , of what i 've found out, it tries to mov the value of the address cs:12345678. Is this what it was suppose to do?? I am using masm package btw..
Posted on 2001-11-03 04:47:12 by Ray
and if yer going to multiply, its like on school on a paper decimal:

.24
.33
.---- *
.72
720
------ +
792

you see? every round you shift the answer to the left like you learned (i guess ;). binary the same

........1011
........1100
......-- ------
......00000
....000000
..1011000
10110000
------------- +
00010111


etc. simple erh?
Posted on 2001-11-03 08:48:19 by lifewire
Ray, it probably crashes because you pass 2 as the size of the numbers when infact they're both dwords so you should pass 1. Secondly your trying to pass the actual values, you have to pass pointers to them.

bitRAKE, I was only just going to write some routines todo just this, I'll probably do it as a learning experince to learn mmx, see if that speeds it up. However I'd be very intrested in see that multiplication code if you have it.
Posted on 2001-11-03 11:09:57 by Eóin
E?in, I couldn't get MMX to do MUL in this way, if you figure it out I'd sure love a *hint*. :) I'll find that proc, it's another nice example of recursion.

Ray, you have to pass pointers to the numbers:

MyFirstNum dd 1,0,0,0 ;Very Big Number
MySecondNum dd 0,0,0,1 ;Very Small Number

; the size is 0 based, pass 3 for 4 dwords size
invoke AddBigNum, ADDR MyFirstNum, ADDR MySecondNum, (LENGTHOF MyFirstNum) - 1

For those interested, THIS (apfloat) looks like a good library.
Posted on 2001-11-03 19:48:44 by bitRAKE
thank you
Posted on 2001-11-05 04:18:46 by Ray