Summation function to minimize rounding issues

Join the discussion
Registration is free. Ask a follow-up in this thread, or start your own.
1 reply · 2K views
Messages
8,947
Reaction score
687
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.

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
    }
}
 
  • Like
Likes   Reactions: jim mcnamara
Physics news on Phys.org
https://www.extremetech.com/computing/272558-japan-tests-silicon-for-exascale-computing-in-2021Futjitsu 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.