Summation function to minimize rounding issues

  • Thread starter rcgldr
  • Start date


Homework Helper
This is a C++ class to be used for summation of doubles (floating point). It uses an array of 2048 doubles indexed by exponent to minimize rounding errors by only adding numbers that have the same exponent.

NUM::NUM - array is cleared out when an instance of NUM is created
NUM::clear() - clears out the array
NUM::addnum() - add a number to the array
NUM::getsum() - returns the current sum of the array

link to zip of source file with example test code that adds 1./5. 4,294,967,295 (2^32-1) times and displays a sum using normal addition and using the SUM class.

This is the key part of the SUM class, the addnum() function:

void SUM::addnum(double d)      // add a number into the array
size_t i;

//      i = exponent of d
        i = ((size_t)((*(unsigned long long *)&d)>>52))&0x7ff;
        if(i == 0x7ff){ // max exponent, could be overflow
            asum[i] += d;
        if(this->asum[i] == 0){ // if empty slot store d
            asum[i] = d;
        d += asum[i];           // else add slot to d, clear slot
        asum[i] = 0.;           // and continue until empty slot

jim mcnamara

Futjitsu has a line of CPU's (One for historical SPARC: SPARC64 VIIIfx ), the newest ones are mentioned in the article above. CPU natively supports a variable floating point precision - with correct rounding. It would be interesting to read the white paper behind this effort.

While what you provide is very useful, I would never put it to work with production code without really extensive testing. Which means, in practice, I could not deploy it. Floating point is the bane of financial calculations, as you obviously know.

Want to reply to this thread?

"Summation function to minimize rounding issues" You must log in or register to reply here.

Physics Forums Values

We Value Quality
• Topics based on mainstream science
• Proper English grammar and spelling
We Value Civility
• Positive and compassionate attitudes
• Patience while debating
We Value Productivity
• Disciplined to remain on-topic
• Recognition of own weaknesses
• Solo and co-op problem solving