use MAXBIGINT_DOUBLE which does not overflow when casting back to bigint
This commit is contained in:
@ -95,6 +95,8 @@ typedef int64_t bigint;
|
|||||||
#define MAXSMALLINT INT_MAX
|
#define MAXSMALLINT INT_MAX
|
||||||
#define MAXTAGINT INT_MAX
|
#define MAXTAGINT INT_MAX
|
||||||
#define MAXBIGINT INT64_MAX
|
#define MAXBIGINT INT64_MAX
|
||||||
|
// INT64_MAX cannot be represented with a double. reduce to avoid overflow when casting back.
|
||||||
|
#define MAXBIGINT_DOUBLE (INT64_MAX-512)
|
||||||
|
|
||||||
#define MPI_LMP_TAGINT MPI_INT
|
#define MPI_LMP_TAGINT MPI_INT
|
||||||
#define MPI_LMP_IMAGEINT MPI_INT
|
#define MPI_LMP_IMAGEINT MPI_INT
|
||||||
@ -132,6 +134,8 @@ typedef int64_t bigint;
|
|||||||
#define MAXSMALLINT INT_MAX
|
#define MAXSMALLINT INT_MAX
|
||||||
#define MAXTAGINT INT64_MAX
|
#define MAXTAGINT INT64_MAX
|
||||||
#define MAXBIGINT INT64_MAX
|
#define MAXBIGINT INT64_MAX
|
||||||
|
// INT64_MAX cannot be represented with a double. reduce to avoid overflow when casting back.
|
||||||
|
#define MAXBIGINT_DOUBLE (INT64_MAX-512)
|
||||||
|
|
||||||
#define MPI_LMP_TAGINT MPI_LL
|
#define MPI_LMP_TAGINT MPI_LL
|
||||||
#define MPI_LMP_IMAGEINT MPI_LL
|
#define MPI_LMP_IMAGEINT MPI_LL
|
||||||
@ -168,6 +172,7 @@ typedef int bigint;
|
|||||||
#define MAXSMALLINT INT_MAX
|
#define MAXSMALLINT INT_MAX
|
||||||
#define MAXTAGINT INT_MAX
|
#define MAXTAGINT INT_MAX
|
||||||
#define MAXBIGINT INT_MAX
|
#define MAXBIGINT INT_MAX
|
||||||
|
#define MAXBIGINT_DOUBLE INT_MAX
|
||||||
|
|
||||||
#define MPI_LMP_TAGINT MPI_INT
|
#define MPI_LMP_TAGINT MPI_INT
|
||||||
#define MPI_LMP_IMAGEINT MPI_INT
|
#define MPI_LMP_IMAGEINT MPI_INT
|
||||||
|
|||||||
@ -2721,8 +2721,8 @@ double Variable::collapse_tree(Tree *tree)
|
|||||||
else if (update->ntimestep < ivalue2) {
|
else if (update->ntimestep < ivalue2) {
|
||||||
bigint offset = update->ntimestep - ivalue1;
|
bigint offset = update->ntimestep - ivalue1;
|
||||||
tree->value = ivalue1 + (offset/ivalue3)*ivalue3 + ivalue3;
|
tree->value = ivalue1 + (offset/ivalue3)*ivalue3 + ivalue3;
|
||||||
if (tree->value > ivalue2) tree->value = (double) MAXBIGINT;
|
if (tree->value > ivalue2) tree->value = (double) MAXBIGINT_DOUBLE;
|
||||||
} else tree->value = (double) MAXBIGINT;
|
} else tree->value = (double) MAXBIGINT_DOUBLE;
|
||||||
return tree->value;
|
return tree->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2758,11 +2758,11 @@ double Variable::collapse_tree(Tree *tree)
|
|||||||
if (istep > ivalue5) {
|
if (istep > ivalue5) {
|
||||||
offset = ivalue5 - ivalue1;
|
offset = ivalue5 - ivalue1;
|
||||||
istep = ivalue1 + (offset/ivalue3)*ivalue3 + ivalue3;
|
istep = ivalue1 + (offset/ivalue3)*ivalue3 + ivalue3;
|
||||||
if (istep > ivalue2) istep = MAXBIGINT;
|
if (istep > ivalue2) istep = MAXBIGINT_DOUBLE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else istep = MAXBIGINT;
|
} else istep = MAXBIGINT_DOUBLE;
|
||||||
tree->value = istep;
|
tree->value = (double)istep;
|
||||||
return tree->value;
|
return tree->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3060,8 +3060,8 @@ double Variable::eval_tree(Tree *tree, int i)
|
|||||||
else if (update->ntimestep < ivalue2) {
|
else if (update->ntimestep < ivalue2) {
|
||||||
bigint offset = update->ntimestep - ivalue1;
|
bigint offset = update->ntimestep - ivalue1;
|
||||||
arg = ivalue1 + (offset/ivalue3)*ivalue3 + ivalue3;
|
arg = ivalue1 + (offset/ivalue3)*ivalue3 + ivalue3;
|
||||||
if (arg > ivalue2) arg = (double) MAXBIGINT;
|
if (arg > ivalue2) arg = (double) MAXBIGINT_DOUBLE;
|
||||||
} else arg = (double) MAXBIGINT;
|
} else arg = (double) MAXBIGINT_DOUBLE;
|
||||||
return arg;
|
return arg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3092,10 +3092,10 @@ double Variable::eval_tree(Tree *tree, int i)
|
|||||||
if (istep > ivalue5) {
|
if (istep > ivalue5) {
|
||||||
offset = ivalue5 - ivalue1;
|
offset = ivalue5 - ivalue1;
|
||||||
istep = ivalue1 + (offset/ivalue3)*ivalue3 + ivalue3;
|
istep = ivalue1 + (offset/ivalue3)*ivalue3 + ivalue3;
|
||||||
if (istep > ivalue2) istep = MAXBIGINT;
|
if (istep > ivalue2) istep = MAXBIGINT_DOUBLE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else istep = MAXBIGINT;
|
} else istep = MAXBIGINT_DOUBLE;
|
||||||
arg = istep;
|
arg = istep;
|
||||||
return arg;
|
return arg;
|
||||||
}
|
}
|
||||||
@ -3627,8 +3627,8 @@ int Variable::math_function(char *word, char *contents, Tree **tree, Tree **tree
|
|||||||
else if (update->ntimestep < ivalue2) {
|
else if (update->ntimestep < ivalue2) {
|
||||||
bigint offset = update->ntimestep - ivalue1;
|
bigint offset = update->ntimestep - ivalue1;
|
||||||
value = ivalue1 + (offset/ivalue3)*ivalue3 + ivalue3;
|
value = ivalue1 + (offset/ivalue3)*ivalue3 + ivalue3;
|
||||||
if (value > ivalue2) value = (double) MAXBIGINT;
|
if (value > ivalue2) value = (double) MAXBIGINT_DOUBLE;
|
||||||
} else value = (double) MAXBIGINT;
|
} else value = (double) MAXBIGINT_DOUBLE;
|
||||||
argstack[nargstack++] = value;
|
argstack[nargstack++] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3662,10 +3662,10 @@ int Variable::math_function(char *word, char *contents, Tree **tree, Tree **tree
|
|||||||
if (istep > ivalue5) {
|
if (istep > ivalue5) {
|
||||||
offset = ivalue5 - ivalue1;
|
offset = ivalue5 - ivalue1;
|
||||||
istep = ivalue1 + (offset/ivalue3)*ivalue3 + ivalue3;
|
istep = ivalue1 + (offset/ivalue3)*ivalue3 + ivalue3;
|
||||||
if (istep > ivalue2) istep = MAXBIGINT;
|
if (istep > ivalue2) istep = MAXBIGINT_DOUBLE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else istep = MAXBIGINT;
|
} else istep = MAXBIGINT_DOUBLE;
|
||||||
double value = istep;
|
double value = istep;
|
||||||
argstack[nargstack++] = value;
|
argstack[nargstack++] = value;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user