/*
**
** Not a surprise, to them that knows:
**
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define A_LEN 500
static float foo[A_LEN];
static double bar[A_LEN];
int
main (void)
{
long i;
double d;
float f;
srand((unsigned)(double)time(NULL));
for (i = 0; i < A_LEN; i++)
{
d = rand () / (rand () + 1.0);
d *= d;
if (rand () % 2)
d = -d;
foo[i] = (float) d;
bar[i] = d;
}
f = 0;
d = 0;
for (i = 0; i < A_LEN; i++)
{
f += foo[i];
d += bar[i];
}
printf ("forward float sum = %.20f\n", f);
printf ("forward double sum = %.20f\n", d);
f = 0;
d = 0;
for (i = A_LEN - 1; i >= 0; i--)
{
f += foo[i];
d += bar[i];
}
printf ("backward float sum = %.20f\n", f);
printf ("backward double sum = %.20f\n", d);
return 0;
}
/*
Typical output:
forward float sum = 231466.62182403207000000000
forward double sum = 231466.62885047426000000000
backward float sum = 231466.62182403210000000000
backward double sum = 231466.62885047423000000000
*/
> -----Original Message-----
> From: Anthony Best [mailto:[EMAIL PROTECTED]
> Sent: Friday, August 08, 2003 12:01 PM
> To: [EMAIL PROTECTED]
> Subject: [GENERAL] Anomaly with SUM().
>
>
> I've noticed that the SUM() seems to overflow under some situations.
>
> The only difference is the order that the data is retrived
> from the database.
>
>
>
> accounting=# select sum(amount) from transactions, chart
> WHERE account=chart.id;
> sum
> ---------------------
> 5.6843418860808e-14
> (1 row)
>
> accounting=# select sum(amount) from transactions, chart
> WHERE account=chart.id AND amount=amount; sum
> -----
> 0
> (1 row)
>
>
>
>
> More Info:
> accounting=# select amount from transactions, chart WHERE
> account=chart.id; amount
> --------
> -75
> 21.13
> -83
> 2.13
> -83
> 21
> 50
> 50
> 2.26
> -166
> 99
> 2.21
> -83
> -100
> 39
> 25
> -70
> -0.02
> 45
> -0.05
> -0.05
> -0.04
> -0.04
> 70
> 75
> 83
> 83
> 166
> 83
> 100
> 0.02
> 0.05
> 0.05
> 0.04
> 0.04
> -21
> -45
> -21.13
> -2.13
> -2.26
> -2.21
> -50
> -50
> -99
> -39
> -25
> (46 rows)
>
> accounting=# select amount from transactions, chart WHERE
> account=chart.id AND amount=amount; amount
> --------
> -70
> 70
> -75
> 75
> -0.02
> 0.02
> -45
> 45
> -21.13
> 21.13
> -0.05
> 0.05
> -83
> 83
> -0.05
> 0.05
> -2.13
> 2.13
> -83
> 83
> -21
> 21
> -50
> 50
> -0.04
> 0.04
> -50
> 50
> -2.26
> 2.26
> -166
> 166
> -99
> 99
> -0.04
> 0.04
> -2.21
> 2.21
> -83
> 83
> -100
> 100
> -39
> 39
> -25
> 25
> (46 rows)
>
>
>
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 8: explain analyze is your friend
>
---------------------------(end of broadcast)---------------------------
TIP 9: the planner will ignore your desire to choose an index scan if your
joining column's datatypes do not match