use MAXBIGINT_DOUBLE which does not overflow when casting back to bigint

This commit is contained in:
Axel Kohlmeyer
2023-02-11 18:59:52 -05:00
parent e99ec32b4b
commit fbe30ffec6
2 changed files with 18 additions and 13 deletions

View File

@ -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

View File

@ -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;
}