Changeset: fcbc964389f8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fcbc964389f8
Removed Files:
sql/test/BugTracker-2011/Tests/and-power.Bug-3013.stable.out.int128
Modified Files:
NT/monetdb_config.h.in
configure.ag
gdk/gdk_aggr.c
gdk/gdk_atoms.c
gdk/gdk_calc.c
monetdb5/modules/kernel/mmath.h
sql/test/BugTracker-2011/Tests/and-power.Bug-3013.stable.out
sql/test/BugTracker-2017/Tests/All
sql/test/mergetables/Tests/All
testing/Mtest.py.in
Branch: default
Log Message:
Merge with Jul2017 branch.
diffs (truncated from 497 to 300 lines):
diff --git a/NT/monetdb_config.h.in b/NT/monetdb_config.h.in
--- a/NT/monetdb_config.h.in
+++ b/NT/monetdb_config.h.in
@@ -160,14 +160,6 @@
/* Define if the fits module is to be enabled */
/* #undef HAVE_FITS */
-/* Define to 1 if you have the `fpclass' function. */
-#define HAVE_FPCLASS 1 /* uses _fpclass, see mmath.c */
-
-/* Define to 1 if you have the `fpclassify' function. */
-#if defined(_MSC_VER) && _MSC_VER > 1600
-#define HAVE_FPCLASSIFY 1
-#endif
-
/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
/* #undef HAVE_FSEEKO */
diff --git a/configure.ag b/configure.ag
--- a/configure.ag
+++ b/configure.ag
@@ -2722,8 +2722,6 @@ AC_CHECK_FUNCS([\
fabsf \
fallocate \
fcntl \
- fpclass \
- fpclassify \
fsync \
ftime \
getexecname \
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,7 @@
#include "gdk.h"
#include "gdk_private.h"
#include "gdk_calc_private.h"
-#ifdef __INTEL_COMPILER
+#if defined(_MSC_VER) && defined(__INTEL_COMPILER)
#include <mathimf.h>
#else
#include <math.h>
@@ -151,13 +151,11 @@ BATgroupaggrinit(BAT *b, BAT *g, BAT *e,
/* ---------------------------------------------------------------------- */
/* sum */
-#if defined(_MSC_VER) && _MSC_VER < 1800
-#ifndef isnan
+#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && _MSC_VER < 1800
+#include <float.h>
#define isnan(x) _isnan(x)
-#endif
-#ifndef isinf
#define isinf(x) (_fpclass(x) & (_FPCLASS_NINF | _FPCLASS_PINF))
-#endif
+#define isfinite(x) _finite(x)
#endif
static inline int
@@ -199,14 +197,19 @@ dofsum(const void *restrict values, oid
int nil_if_empty, const char *func)
{
struct pergroup {
- size_t npartials;
- size_t maxpartials;
- double *partials;
+ int npartials;
+ int maxpartials;
int valseen;
+#ifdef INFINITES_ALLOWED
+ float infs;
+#else
+ int infs;
+#endif
+ double *partials;
} *pergroup;
- size_t listi;
- size_t parti;
- size_t i;
+ BUN listi;
+ int parti;
+ int i;
BUN grp;
double x, y;
volatile double lo, hi;
@@ -230,9 +233,10 @@ dofsum(const void *restrict values, oid
if (pergroup == NULL)
return BUN_NONE;
for (grp = 0; grp < ngrp; grp++) {
- pergroup[grp].npartials = 1;
+ pergroup[grp].npartials = 0;
pergroup[grp].valseen = 0;
- pergroup[grp].maxpartials = 32;
+ pergroup[grp].maxpartials = 2;
+ pergroup[grp].infs = 0;
pergroup[grp].partials = GDKmalloc(pergroup[grp].maxpartials *
sizeof(double));
if (pergroup[grp].partials == NULL) {
while (grp > 0)
@@ -240,7 +244,6 @@ dofsum(const void *restrict values, oid
GDKfree(pergroup);
return BUN_NONE;
}
- pergroup[grp].partials[0] = 0;
}
for (;;) {
if (cand) {
@@ -276,8 +279,14 @@ dofsum(const void *restrict values, oid
continue;
}
pergroup[grp].valseen = 1;
- i = 1;
- for (parti = 1; parti < pergroup[grp].npartials; parti++) {
+#ifdef INFINITES_ALLOWED
+ if (isinf(x)) {
+ pergroup[grp].infs += x;
+ continue;
+ }
+#endif
+ i = 0;
+ for (parti = 0; parti < pergroup[grp].npartials; parti++) {
y = pergroup[grp].partials[parti];
if (fabs(x) < fabs(y))
exchange(&x, &y);
@@ -286,7 +295,7 @@ dofsum(const void *restrict values, oid
int sign = hi > 0 ? 1 : -1;
hi = x - twopow * sign;
x = hi - twopow * sign;
- pergroup[grp].partials[0] += sign;
+ pergroup[grp].infs += sign;
if (fabs(x) < fabs(y))
exchange(&x, &y);
twosum(&hi, &lo, x, y);
@@ -296,12 +305,10 @@ dofsum(const void *restrict values, oid
x = hi;
}
if (x != 0) {
- if (i == pergroup[grp].maxpartials - 1) {
- /* -1 to make sure we have one spare
- * for the final step below */
+ if (i == pergroup[grp].maxpartials) {
double *temp;
pergroup[grp].maxpartials +=
pergroup[grp].maxpartials;
- temp = GDKrealloc(pergroup[grp].partials,
pergroup[grp].maxpartials);
+ temp = GDKrealloc(pergroup[grp].partials,
pergroup[grp].maxpartials * sizeof(double));
if (temp == NULL)
goto bailout;
pergroup[grp].partials = temp;
@@ -324,10 +331,8 @@ dofsum(const void *restrict values, oid
pergroup[grp].partials = NULL;
continue;
}
- if (isinf(pergroup[grp].partials[0]) ||
- isnan(pergroup[grp].partials[0])) {
- /* isnan: cannot happen: infinities of both
- * signs in summands */
+#ifdef INFINITES_ALLOWED
+ if (isinf(pergroup[grp].infs) || isnan(pergroup[grp].infs)) {
if (abort_on_error) {
goto overflow;
}
@@ -340,17 +345,18 @@ dofsum(const void *restrict values, oid
pergroup[grp].partials = NULL;
continue;
}
+#endif
- if (fabs(pergroup[grp].partials[0]) == 1.0 &&
- pergroup[grp].npartials > 1 &&
- !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 ((pergroup[grp].infs == 1 || pergroup[grp].infs == -1) &&
+ pergroup[grp].npartials > 0 &&
+ !samesign(pergroup[grp].infs,
pergroup[grp].partials[pergroup[grp].npartials - 1])) {
+ twosum(&hi, &lo, pergroup[grp].infs * twopow,
pergroup[grp].partials[pergroup[grp].npartials - 1] / 2);
if (isinf(2 * hi)) {
y = 2 * lo;
x = hi + y;
x -= hi;
if (x == y &&
- pergroup[grp].npartials > 2 &&
+ pergroup[grp].npartials > 1 &&
samesign(lo,
pergroup[grp].partials[pergroup[grp].npartials - 2])) {
GDKfree(pergroup[grp].partials);
pergroup[grp].partials = NULL;
@@ -375,18 +381,27 @@ dofsum(const void *restrict values, oid
}
} else {
if (lo) {
- /* we made sure above that we
- * have space for one more
- * partial */
+ if (pergroup[grp].npartials ==
pergroup[grp].maxpartials) {
+ double *temp;
+ /* we need space for one more */
+ pergroup[grp].maxpartials++;
+ temp =
GDKrealloc(pergroup[grp].partials, pergroup[grp].maxpartials * sizeof(double));
+ if (temp == NULL)
+ goto bailout;
+ pergroup[grp].partials = temp;
+ }
pergroup[grp].partials[pergroup[grp].npartials - 1] = 2 * lo;
pergroup[grp].partials[pergroup[grp].npartials++] = 2 * hi;
} else {
pergroup[grp].partials[pergroup[grp].npartials - 1] = 2 * hi;
}
- pergroup[grp].partials[0] = 0;
+ pergroup[grp].infs = 0;
}
}
+ if (pergroup[grp].infs != 0)
+ goto overflow;
+
if (pergroup[grp].npartials == 0) {
GDKfree(pergroup[grp].partials);
pergroup[grp].partials = NULL;
@@ -396,8 +411,6 @@ dofsum(const void *restrict values, oid
((dbl *) results)[grp] = 0;
continue;
}
- if (pergroup[grp].partials[0] != 0)
- goto overflow;
/* accumulate into hi */
hi = pergroup[grp].partials[--pergroup[grp].npartials];
diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c
--- a/gdk/gdk_atoms.c
+++ b/gdk/gdk_atoms.c
@@ -23,12 +23,18 @@
#include "monetdb_config.h"
#include "gdk.h"
#include "gdk_private.h"
-#include <math.h> /* for isfinite macro */
-#ifdef HAVE_IEEEFP_H
-#include <ieeefp.h> /* for Solaris */
-#ifndef isfinite
-#define isfinite(f) finite(f)
+#if defined(_MSC_VER) && defined(__INTEL_COMPILER)
+#include <mathimf.h> /* Intel compiler on Windows */
+#else
+#include <math.h> /* anywhere else */
#endif
+
+/* these are only for older Visual Studio compilers (VS 2010) */
+#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && _MSC_VER < 1800
+#include <float.h>
+#define isnan(x) _isnan(x)
+#define isinf(x) (_fpclass(x) & (_FPCLASS_NINF | _FPCLASS_PINF))
+#define isfinite(x) _finite(x)
#endif
static int
@@ -906,10 +912,6 @@ atom_io(ptr, Int, int)
#else /* SIZEOF_VOID_P == SIZEOF_LNG */
atom_io(ptr, Lng, lng)
#endif
-#if defined(_MSC_VER) && !defined(isfinite)
-/* with more recent Visual Studio, isfinite is defined */
-#define isfinite(x) _finite(x)
-#endif
ssize_t
dblFromStr(const char *src, size_t *len, dbl **dst)
@@ -947,9 +949,7 @@ dblFromStr(const char *src, size_t *len,
p = pe;
n = (ssize_t) (p - src);
if (n == 0 || (errno == ERANGE && (d < -1 || d > 1))
-#ifdef isfinite
|| !isfinite(d) /* no NaN or Infinte */
-#endif
) {
GDKerror("overflow or not a number\n");
return -1;
@@ -1021,9 +1021,7 @@ fltFromStr(const char *src, size_t *len,
#else /* no strtof, try sscanf */
if (sscanf(src, "%f%n", &f, &n) <= 0 || n <= 0
#endif
-#ifdef isfinite
|| !isfinite(f) /* no NaN or infinite */
-#endif
) {
GDKerror("overflow or not a number\n");
return -1;
diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -10,7 +10,11 @@
#include "gdk.h"
#include "gdk_private.h"
#include "gdk_calc_private.h"
+#if defined(_MSC_VER) && defined(__INTEL_COMPILER)
+#include <mathimf.h>
+#else
#include <math.h>
+#endif
/* Define symbol FULL_IMPLEMENTATION to get implementations for all
* sensible output types for +, -, *, /. Without the symbol, all
diff --git a/monetdb5/modules/kernel/mmath.h b/monetdb5/modules/kernel/mmath.h
--- a/monetdb5/modules/kernel/mmath.h
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list