P: n/a

Hello,
I've decided to try my hand at writing a decimal class that is suitable
for storing weights, money, and time, etc, because I haven't found a
*decimal* class (yes, I know that boost and gmp have rationals, but
that's not exactly easy to use for money and weights)
I'm storing the number in a signed long int, along with another int
called offset which contains where the decimal point goes. So far I
have implemented addition, subtraction, and multiplication. Those were
easy, but I need some tips on how to do division.
I need to calculate as many decimal places as I can without, without
running out of room in long int. I can store only 10 digits... For
example, 1000/362.33 would need to be rounded to 2.759914995, instead
of 618165760657813034839591637137[...]. Any ideas how to actually
implement this?
Also, I'd like some input on if the way I'm doing this is really the
right way, thoughts?
Thanks!

Taj  
Share this Question
P: n/a

Look at the source for "dc" (Linux).
"dc is a reversepolish desk calculator which supports unlimited
precision arithmetic."  
P: n/a

I am not sure what you are asking for but for rounding numbers there are
floor() and ceil functions....
tajmorton wrote: Hello, I've decided to try my hand at writing a decimal class that is suitable for storing weights, money, and time, etc, because I haven't found a *decimal* class (yes, I know that boost and gmp have rationals, but that's not exactly easy to use for money and weights)
I'm storing the number in a signed long int, along with another int called offset which contains where the decimal point goes. So far I have implemented addition, subtraction, and multiplication. Those were easy, but I need some tips on how to do division.
I need to calculate as many decimal places as I can without, without running out of room in long int. I can store only 10 digits... For example, 1000/362.33 would need to be rounded to 2.759914995, instead of 618165760657813034839591637137[...]. Any ideas how to actually implement this?
Also, I'd like some input on if the way I'm doing this is really the right way, thoughts?
Thanks!  
P: n/a

tajmorton wrote: I'm storing the number in a signed long int, along with another int called offset which contains where the decimal point goes.
I wouldn't use a limited representation for a decimal class. Instead,
I would use a variable size array of unsigned characters each holding
two decimal digits and a sign stored somewhere.
So far I have implemented addition, subtraction, and multiplication. Those were easy, but I need some tips on how to do division.
At least a naive implementation is to use the usual approach to
division you also use when dividing manually. There are more tricky
approach to compute with arbitrary bases and if I remember correctly
Donald Knuth' "Art of Computer Programming" discusses these.

<mailto:di***********@yahoo.com> <http://www.dietmarkuehl.de/>
<http://www.eaisystems.com>  Efficient Artificial Intelligence  
P: n/a

tajmorton wrote: Hello, I've decided to try my hand at writing a decimal class that is suitable for storing weights, money, and time, etc, because I haven't found a *decimal* class (yes, I know that boost and gmp have rationals, but that's not exactly easy to use for money and weights)
I'm storing the number in a signed long int, along with another int called offset which contains where the decimal point goes. So far I have implemented addition, subtraction, and multiplication. Those were easy, but I need some tips on how to do division.
I need to calculate as many decimal places as I can without, without running out of room in long int. I can store only 10 digits... For example, 1000/362.33 would need to be rounded to 2.759914995, instead of 618165760657813034839591637137[...]. Any ideas how to actually implement this?
I'm not sure if you really wants this. I'd assume, if you calculate
an instance of you class as the result of 1000/362.33 (name it x),
what you want is x*362.33 == 1000 and 1000/x == 362.33.
Or suppose someone calculates x 10 times, calculates the sum of these
and divides it by 10. (Its a very common operation while playing
with money  consider invoices, different currencies and a customer
paying multiple invoices at once).
Also, I'd like some input on if the way I'm doing this is really the right way, thoughts?
I think a better way is to store the amounts as fractionals (ie using
two longs for numerator/denominator). So you don't need any division
during an internal calculation. Your results are always correct.
Only the user visible output needs to be rounded.
Mathias   This discussion thread is closed Replies have been disabled for this discussion.   Question stats  viewed: 1780
 replies: 4
 date asked: Dec 17 '05
