COMPGROUPS.NET | Search | Post Question | Groups | Stream | About | Register

### Speaking of sum programs (let's keep Razi out of it) here's my version:

• Email
• Follow

```typedef struct KahanAdder_t {
double sum_; /* The current working sum. */
double carry_; /* The carry from the previous operation */
double temp_; /* A temp used to capture residual bits of precision
*/
double y_; /* A temp used to capture residual bits of precision */

/* After each add operation, the carry will contain the additional */
/* bits that could be left out from the previous operation. */
{
kp->y_ = datum - kp->carry_;
kp->temp_ = kp->sum_ + kp->y_;
kp->carry_ = (kp->temp_ - kp->sum_) - kp->y_;
kp->sum_ = kp->temp_;
}

{
kp->y_ = 0;
kp->temp_ = 0;
kp->carry_ = 0;
kp->sum_ = 0;
}

#define MAXLINELEN 256

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <float.h>
int             main(void)
{
double          d;
double          standard_sum = 0;
float           standard_sum_f = 0;
clock_t         start, end;
unsigned        count = 0;
char line[MAXLINELEN];

setvbuf(stdin, NULL, _IOFBF, 1024 * 16);
start = clock();
while (fgets(line, sizeof line, stdin)) {
d = atof(line);
standard_sum += d;
standard_sum_f += (float) d;
count++;
}
end = clock();

printf("Standard sum (double) = %20.15f\n"
"Kahan sum (double)    = %20.15f\n"
"Standard sum (float)  = %20.15f\n"
"Number of items was %u\n"
"Time consumed was %f seconds\n",
standard_sum,
k.sum_,
standard_sum_f,
count,
(end - start) * 1.0 / CLOCKS_PER_SEC
);

return 0;
}
/* Possible Output from a file of 5,000,001 numbers:
C:\tmp\Release> foo.exe < c:\tmp\n.txt
Standard sum (double) = 27104700.447471067000000
Kahan sum (double)    = 27104700.447473072000000
Standard sum (float)  = 26857582.000000000000000
Number of items was 5000001
Time consumed was 4.594000 seconds
*/

```
 0
Reply dcorbit (2698) 5/7/2008 8:46:33 PM

See related articles to this posting

0 Replies
58 Views

Similar Articles

12/7/2013 1:15:11 AM
[PageSpeed]