Summation function to minimize rounding issues

rcgldr

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::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.

http://rcgldr.net/misc/sum.zip

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

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

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

Related Programming and Computer Science News on Phys.org

jim mcnamara

Mentor
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.

"Summation function to minimize rounding issues"

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