philsmicronet
asked on
BCD
Does anyone know of a BCD (Binary coded decimal) library available for C?
ASKER
What about if you need to add, subtract, multiply etv etc
That is why I provided the link :o)
ASKER
This allows you to convert from BCD to double and back, however, if you do this you are going to still have the same rounding problems that you would normally have with floating point arithmetic. I would have thought that generic BCD add, subtract etc etc would be required.
"BCD math library C source" on Goolge gives you scores of links.
@ robert_marquardt:
True, google gives you scores of links -- but 'quantity' is spelled differently from 'quality'.
@ philsmicronet:
Basically, any x86-processor supports BCD's. I didn't find a link with a BCD math library. However, this might be useful to you:
http://www.intel.com/design/intarch/techinfo/Pentium/instsum.htm
Search for "Packed BCD Adjustment Instructions"/"Unpacked BCD Adjustment Instructions" -- it deals with double/single-digit BCD's only, but can easily extended to multi-digit-BCD's. It is 16-bit code so don't expect any high-performance-operation s. Anyway, here are some ASM-code-snippets:
Addition [using aaa = "ascii adjust after addition"]:
mov ax,9 ;ax = 0x0009
mov bx,3 ;bx = 0x0003
add al,bl ;ax = 0x000c = 12d
aaa ;ax = 0x0102
Multiply [using aam = "ascii adjust after multiply"]:
mov al,5 ;al = 0x0005
mov bl,7 ;bl = 0x0007
mul bl ;ax = al * bl = 0x0023 = 35d
aam ;ax = 0x0305
Hope that provides at least some help to you. Regards,
.f
True, google gives you scores of links -- but 'quantity' is spelled differently from 'quality'.
@ philsmicronet:
Basically, any x86-processor supports BCD's. I didn't find a link with a BCD math library. However, this might be useful to you:
http://www.intel.com/design/intarch/techinfo/Pentium/instsum.htm
Search for "Packed BCD Adjustment Instructions"/"Unpacked BCD Adjustment Instructions" -- it deals with double/single-digit BCD's only, but can easily extended to multi-digit-BCD's. It is 16-bit code so don't expect any high-performance-operation
Addition [using aaa = "ascii adjust after addition"]:
mov ax,9 ;ax = 0x0009
mov bx,3 ;bx = 0x0003
add al,bl ;ax = 0x000c = 12d
aaa ;ax = 0x0102
Multiply [using aam = "ascii adjust after multiply"]:
mov al,5 ;al = 0x0005
mov bl,7 ;bl = 0x0007
mul bl ;ax = al * bl = 0x0023 = 35d
aam ;ax = 0x0305
Hope that provides at least some help to you. Regards,
.f
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
No, its just aprogram I am working on.
Wow, that was really a quick accept - so, now, would you be so kind and explain why you accepted an answer that reads " if I can find the code, would you be interested in it?" over the others that had good suggestions? As for my part, this is not really motivating to help you in the future.
I'm puzzled as well. Must have been a mouse click error.
Jim
Jim
ASKER
Oooops. Was going through my old questions that I had not accepted (only two) and selected the wrong comment.
The Binary Coded Decimal, or BCD code, is used as the direct code to communicate decimal numbers using
a binary code. Recall that the decimal numbers are 0 to 9. BCD code is used to directly translate these
decimal numbers using a 4-bit code.
Here are the decimal equivalent 4-bit BCD codes;
Decimal BCD
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
Notice that each single decimal digit has an equivalent 4-bit BCD code.
Converting Decimal to BCD
This conversion simply requires you to represent each decimal digit with its 4-bit BCD code.
Eg. 38210 = (310 = 0011BCD), (810 = 1000BCD) and (210 = 0010BCD) so;
the result is 001110000010BCD and dropping the leading zeros = 1110000010BCD
Converting BCD to Decimal
This is just grouping every 4 bits of BDC code (starting at the LSD) and representing each 4-bit code
with its equivalent decimal number.
Eg. 100100101000BCD = (1000 = 8), (0010 = 2) and (1001 = 9) so;
the decimal equivalent is 92810
Nevertheless, check out this one: http://www.1cplusplusstreet.com/vb/scripts/ShowCode.asp?txtCodeId=625&lngWId=3 ("BCD math")