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 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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user