diff --git a/src/lmptype.h b/src/lmptype.h index bf56d07d77..a5aa08e390 100644 --- a/src/lmptype.h +++ b/src/lmptype.h @@ -95,6 +95,8 @@ typedef int64_t bigint; #define MAXSMALLINT INT_MAX #define MAXTAGINT INT_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_IMAGEINT MPI_INT @@ -132,6 +134,8 @@ typedef int64_t bigint; #define MAXSMALLINT INT_MAX #define MAXTAGINT 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_IMAGEINT MPI_LL @@ -168,6 +172,7 @@ typedef int bigint; #define MAXSMALLINT INT_MAX #define MAXTAGINT INT_MAX #define MAXBIGINT INT_MAX +#define MAXBIGINT_DOUBLE INT_MAX #define MPI_LMP_TAGINT MPI_INT #define MPI_LMP_IMAGEINT MPI_INT diff --git a/src/variable.cpp b/src/variable.cpp index 2d6d4694d1..d26c0185db 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -2721,8 +2721,8 @@ double Variable::collapse_tree(Tree *tree) else if (update->ntimestep < ivalue2) { bigint offset = update->ntimestep - ivalue1; tree->value = ivalue1 + (offset/ivalue3)*ivalue3 + ivalue3; - if (tree->value > ivalue2) tree->value = (double) MAXBIGINT; - } else tree->value = (double) MAXBIGINT; + if (tree->value > ivalue2) tree->value = (double) MAXBIGINT_DOUBLE; + } else tree->value = (double) MAXBIGINT_DOUBLE; return tree->value; } @@ -2758,11 +2758,11 @@ double Variable::collapse_tree(Tree *tree) if (istep > ivalue5) { offset = ivalue5 - ivalue1; istep = ivalue1 + (offset/ivalue3)*ivalue3 + ivalue3; - if (istep > ivalue2) istep = MAXBIGINT; + if (istep > ivalue2) istep = MAXBIGINT_DOUBLE; } } - } else istep = MAXBIGINT; - tree->value = istep; + } else istep = MAXBIGINT_DOUBLE; + tree->value = (double)istep; return tree->value; } @@ -3060,8 +3060,8 @@ double Variable::eval_tree(Tree *tree, int i) else if (update->ntimestep < ivalue2) { bigint offset = update->ntimestep - ivalue1; arg = ivalue1 + (offset/ivalue3)*ivalue3 + ivalue3; - if (arg > ivalue2) arg = (double) MAXBIGINT; - } else arg = (double) MAXBIGINT; + if (arg > ivalue2) arg = (double) MAXBIGINT_DOUBLE; + } else arg = (double) MAXBIGINT_DOUBLE; return arg; } @@ -3092,10 +3092,10 @@ double Variable::eval_tree(Tree *tree, int i) if (istep > ivalue5) { offset = ivalue5 - ivalue1; 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; return arg; } @@ -3627,8 +3627,8 @@ int Variable::math_function(char *word, char *contents, Tree **tree, Tree **tree else if (update->ntimestep < ivalue2) { bigint offset = update->ntimestep - ivalue1; value = ivalue1 + (offset/ivalue3)*ivalue3 + ivalue3; - if (value > ivalue2) value = (double) MAXBIGINT; - } else value = (double) MAXBIGINT; + if (value > ivalue2) value = (double) MAXBIGINT_DOUBLE; + } else value = (double) MAXBIGINT_DOUBLE; argstack[nargstack++] = value; } @@ -3662,10 +3662,10 @@ int Variable::math_function(char *word, char *contents, Tree **tree, Tree **tree if (istep > ivalue5) { offset = ivalue5 - ivalue1; 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; argstack[nargstack++] = value; }