Slashdot Mirror


Rounding Algorithms

dtmos writes "Clive Maxfield has an interesting article up on PL DesignLine cataloging most (all?) of the known rounding algorithms used in computer math. As he states, "...the mind soon boggles at the variety and intricacies of the rounding algorithms that may be used for different applications ... round-up, round-down, round-toward-nearest, arithmetic rounding, round-half-up, round-half-down, round-half-even, round-half-odd, round-toward-zero, round-away-from-zero, round-ceiling, round-floor, truncation (chopping), round-alternate, and round-random (stochastic rounding), to name but a few." It's a good read, especially if you *think* you know what your programs are doing."

3 of 279 comments (clear)

  1. Think you know.... by thewiz · · Score: 4, Insightful

    especially if you *think* you know what your programs are doing.

    Pfft... I've been writing programs and working with computers for over 25 years. I *STILL* haven't figured out what they are doing. Come to think of it, I could say the samething about my wife.

    --
    If "disco" means "I learn" in Latin, does "discothèque" mean "I learn technology"?
  2. Doesn't work for negative numbers. by Anonymous Coward · · Score: 4, Insightful

    -5.8 --> -5.8+0.5 --> -5.3 --> truncate(-5.3) = -5.0

    which is not what you want.

    In c++, using std::floor will give the correct results with this method though

    -5.8 --> -5.8+0.5 --> -5.3 --> floor(-5.3) = -6.0 (correct)

    whereas :

    -5.3 --> -5.3+0.5 --> -4.8 --> floor(-4.8) = -5.0 (correct)

  3. Re:Only with money in fractions by MarkusQ · · Score: 4, Insightful

    For illustration, suppose we use a floating-point format with a 10-bit mantissa. For a fixed exponent (say 0), this can represent values from 1.0 to 1 1023/1024, in 1/1024 increments. The AVERAGE of these UNROUNDED values is 1 1023/2048, which is LESS THAN 1.5. However, if all these values are rounded (with 0.5 rounding up), the AVERAGE of the ROUNDED values will be EQUAL TO 1.5, an average increase of 1/2048. Thus, this type of rounding introduces a measurable positive bias into the arithmetic.

    No, the "bias" came from your choice of data (and your unrealistic expectation that the average of a set of rounded values would equal the average of the unrounded set).

    Such examples are as easy to construct as they are misleading. Suppose we instead take the values {0.2, 0.3, and 0.5}. Their average is 1/3, and if we round them ".5 up" we wind up with {0,0,1} with exactly the same average. On the other hand, if we round them with ".5 to even" we wind up with {0,0,0} with the average of zero and an "error" (by your metric) of 100%.

    --MarkusQ