将double转换为int的安全方法是什么?
if ((inputVar < INT_MAX) && (INT_MIN < inputVar)){
失败的边缘情况。
错误的边缘,因为它更像,但不完全一样 (inputVar < INT_MAX + 1) && (INT_MIN - 1 < inputVar)
请注意代码,some_FP < SOME_INT_MAX
因为SOME_INT_MAX
可能无法转换为所需的 FP 值,因为整数类型可能比 FP 具有更高的精度。这通常不是int, double
.
测试 是否在1double
的范围内。注意 () 而不是 []。 (INT_MIN-1 .... INT_MAX+1)
如果不是,则以您选择的某种定义的方式出错或处理。
假设典型的 2 的补码,但不假设double
超过的精度int
(将代码迁移到这种方式更有用float, long long
),一些示例代码:
// FP version of INT_MAX + 1.0
// Avoid direct (INT_MAX + 1.0) as that can have precision woes
#define DBL_INTMAX_P1 ((INT_MAX/2 + 1)*2.0)
int X_int_from_double(double x) {
// Coded to insure NAN fails the if()
if (!(x - INT_MIN > -1.0 && x < DBL_INTMAX_P1)) {
errno = ERANGE;
fprintf(stderr, "Error in %s, %.*e too large\n", __func__, DBL_DECIMAL_DIG - 1, x);
exit(EXIT_FAILURE);
// or additional code to handle conversion in some specified manner
// Example: assuming "wrap"
if (!isfinite(x)) {
if (!isnan(x)) return 0;
if (x > 0) return INT_MAX;
else return INT_MIN;
}
modf(x, &x); // drop fraction
x = fmod(x, DBL_INTMAX_P1*2);
if (x >= DBL_INTMAX_P1) x -= DBL_INTMAX_P1*2;
else if (x < -DBL_INTMAX_P1) x += DBL_INTMAX_P1*2;
}
return (int) x;
}
要记录失败的行,请考虑使用宏来传递行号。
int X_int_from_double(double x, unsigned);
#define DOUBLE_TO_INT(x) X_int_from_double((x), __LINE__)
1示例 -2,147,483,648.9999... 到 2,147,483,647.9999...