将 ceil 的结果转换为整数是否安全?

Is it safe to cast result of ceil to integer?

ceil C 中的函数声明为 double ceil(double)。将函数的 return 值转换为 int 是否安全?我的意思是是否可以保证以下情况永远不会发生(示例只是为了说明我的意思)?

double r = ceil(234235.53453);
// imagine r = 234235.9999999 due to round errors or
// due to the peculiarities of the machine arithmetics, etc.
int i = (int)r;
// i = 234235, but must be 234236

当然,我知道double的范围比int的范围大,所以转换可能会失败。我的问题不是关于它,而是关于舍入误差或机器算术副作用。

64 位 double 准确表示 2 的 53 次方整数。大于它的整数在表示为 double.

时没有任何小数部分

换句话说,您可以安全地将 ceilfloor 的结果转换为整数,只要该整数可以容纳该值即可。

假设 ceil 的结果在 int 的范围内(或任何类型转换),转换是安全的。舍入误差仅在所讨论的数字不能用二进制精确表示时才会出现。例如0.5可以精确表示为二进制数,而0.1则不能。

由于ceil的结果是一个整数,可以用二进制精确表示,不存在舍入误差,可以安全转换。


您可以通过将数字表示为约分数并查看分母来判断该数字是否可以表示为终止值或非终止值。如果分母只包含所求基数的因数,则可以精确表示,否则就是无限重复的数。

回到0.5和0.1的例子,这些数字的简化小数表示是1/21/10。这两个数字都可以精确地用十进制表示,因为 2 和 10 都只包含 10 的因数。但是只有第一个可以用二进制表示,因为 10 有 5 作为因数,而不是 2 的因数。

在整数的情况下,它们都可以表示为分母为1的分数。并且由于1是所有整数的因子,所以任何整数都可以在任何基数(包括2)中精确表示。