Changeset: 4f67aa73f954 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4f67aa73f954
Modified Files:
gdk/gdk_aggr.c
Branch: default
Log Message:
Merge with Jul2017 branch.
diffs (110 lines):
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -10,7 +10,11 @@
#include "gdk.h"
#include "gdk_private.h"
#include "gdk_calc_private.h"
+#ifdef __INTEL_COMPILER
+#include <mathimf.h>
+#else
#include <math.h>
+#endif
/* grouped aggregates
*
@@ -163,7 +167,7 @@ samesign(double x, double y)
* fact that the sum returns INFINITY in *hi of the correct sign
* (i.e. isinf() returns TRUE) in case of overflow. */
static inline void
-twosum(double *hi, double *lo, double x, double y)
+twosum(volatile double *hi, volatile double *lo, double x, double y)
{
volatile double yr;
@@ -200,7 +204,7 @@ dofsum(const void *restrict values, oid
size_t i;
BUN grp;
double x, y;
- double lo, hi;
+ volatile double lo, hi;
double twopow = pow((double) FLT_RADIX, (double) (DBL_MAX_EXP - 1));
BUN nils = 0;
@@ -275,7 +279,8 @@ dofsum(const void *restrict values, oid
twosum(&hi, &lo, x, y);
if (isinf(hi)) {
int sign = hi > 0 ? 1 : -1;
- x = x - twopow * sign - twopow * sign;
+ hi = x - twopow * sign;
+ x = hi - twopow * sign;
pergroup[grp].partials[0] += sign;
if (fabs(x) < fabs(y))
exchange(&x, &y);
@@ -336,12 +341,15 @@ dofsum(const void *restrict values, oid
!samesign(pergroup[grp].partials[0],
pergroup[grp].partials[pergroup[grp].npartials - 1])) {
twosum(&hi, &lo, pergroup[grp].partials[0] * twopow,
pergroup[grp].partials[pergroup[grp].npartials - 1] / 2);
if (isinf(2 * hi)) {
- if (hi + 2 * lo - hi == 2 * lo &&
+ y = 2 * lo;
+ x = hi + y;
+ x -= hi;
+ if (x == y &&
pergroup[grp].npartials > 2 &&
samesign(lo,
pergroup[grp].partials[pergroup[grp].npartials - 2])) {
GDKfree(pergroup[grp].partials);
pergroup[grp].partials = NULL;
- x = 2 * (hi + 2 * lo);
+ x = 2 * (hi + y);
if (tp2 == TYPE_flt) {
if (x > GDK_flt_max ||
x <= GDK_flt_min) {
@@ -386,10 +394,10 @@ dofsum(const void *restrict values, oid
if (pergroup[grp].partials[0] != 0)
goto overflow;
- /* accumulate into x */
- x = pergroup[grp].partials[--pergroup[grp].npartials];
+ /* accumulate into hi */
+ hi = pergroup[grp].partials[--pergroup[grp].npartials];
while (pergroup[grp].npartials > 0) {
- twosum(&x, &lo, x,
pergroup[grp].partials[--pergroup[grp].npartials]);
+ twosum(&hi, &lo, hi,
pergroup[grp].partials[--pergroup[grp].npartials]);
if (lo) {
pergroup[grp].partials[pergroup[grp].npartials++] = lo;
break;
@@ -398,28 +406,28 @@ dofsum(const void *restrict values, oid
if (pergroup[grp].npartials >= 2 &&
samesign(pergroup[grp].partials[pergroup[grp].npartials -
1], pergroup[grp].partials[pergroup[grp].npartials - 2]) &&
- x + 2 * pergroup[grp].partials[pergroup[grp].npartials - 1]
- x == 2 * pergroup[grp].partials[pergroup[grp].npartials - 1]) {
- x += 2 * pergroup[grp].partials[pergroup[grp].npartials
- 1];
+ hi + 2 * pergroup[grp].partials[pergroup[grp].npartials -
1] - hi == 2 * pergroup[grp].partials[pergroup[grp].npartials - 1]) {
+ hi += 2 *
pergroup[grp].partials[pergroup[grp].npartials - 1];
pergroup[grp].partials[pergroup[grp].npartials - 1] =
-pergroup[grp].partials[pergroup[grp].npartials - 1];
}
GDKfree(pergroup[grp].partials);
pergroup[grp].partials = NULL;
if (tp2 == TYPE_flt) {
- if (x > GDK_flt_max || x <= GDK_flt_min) {
+ if (hi > GDK_flt_max || hi <= GDK_flt_min) {
if (abort_on_error)
goto overflow;
((flt *) results)[grp] = flt_nil;
nils++;
} else
- ((flt *) results)[grp] = (flt) x;
- } else if (x == GDK_dbl_min) {
+ ((flt *) results)[grp] = (flt) hi;
+ } else if (hi == GDK_dbl_min) {
if (abort_on_error)
goto overflow;
((dbl *) results)[grp] = dbl_nil;
nils++;
} else
- ((dbl *) results)[grp] = x;
+ ((dbl *) results)[grp] = hi;
}
GDKfree(pergroup);
return nils;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list