Implementing a Decimal class

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • tajmorton

    #1

    Implementing a Decimal class

    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 618165760657813 034839591637137[...]. 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

  • edward.birch@gmail.com

    #2
    Re: Implementing a Decimal class

    Look at the source for "dc" (Linux).
    "dc is a reverse-polish desk calculator which supports unlimited
    precision arithmetic."

    Comment

    • Viktor Prehnal

      #3
      Re: Implementing a Decimal class

      I am not sure what you are asking for but for rounding numbers there are
      floor() and ceil functions....


      tajmorton wrote:[color=blue]
      > 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 618165760657813 034839591637137[...]. 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![/color]

      Comment

      • Dietmar Kuehl

        #4
        Re: Implementing a Decimal class

        tajmorton wrote:[color=blue]
        > I'm storing the number in a signed long int, along with another int
        > called offset which contains where the decimal point goes.[/color]

        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.
        [color=blue]
        > So far I
        > have implemented addition, subtraction, and multiplication. Those were
        > easy, but I need some tips on how to do division.[/color]

        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:dietmar _kuehl@yahoo.co m> <http://www.dietmar-kuehl.de/>
        <http://www.eai-systems.com> - Efficient Artificial Intelligence

        Comment

        • Mathias Waack

          #5
          Re: Implementing a Decimal class

          tajmorton wrote:
          [color=blue]
          > 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 618165760657813 034839591637137[...]. Any
          > ideas how to actually implement this?[/color]

          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).
          [color=blue]
          > Also, I'd like some input on if the way I'm doing this is really
          > the right way, thoughts?[/color]

          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

          Comment

          Working...