ceil
中的 C
函数声明为double ceil(double)
。将函数的返回值强制转换为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
的范围,因此演员表可能会失败。我的问题不是关于它,而是关于舍入错误或机器算术的副作用。
答案 0 :(得分:7)
64位double
表示精确到53的整数,最多为2。大于的整数在表示为double
时没有任何小数部分。
换句话说,只要该整数可以保存该值,您就可以安全地将ceil
或floor
的结果转换为整数。
答案 1 :(得分:5)
假设ceil
的结果符合int
的范围(或任何可能的类型),则演员是安全的。当有问题的数字不能用二进制表示时,舍入错误才会发挥作用。例如,0.5可以精确表示为二进制数,但0.1不能。
由于ceil
的结果是一个整数,它可以用二进制表示,因此没有舍入误差,因此可以安全地进行转换。
您可以通过将数字表示为减少的分数并查看分母来判断数字是否可以表示为终止或非终止值。如果分母只包含相关基数的因子,则可以准确表达,否则它是无限重复的数字。
回到0.5和0.1的例子,这些数字的简化分数表示为1/2
和1/10
。这两个数字都可以精确地用十进制表示,因为2和10都只包含10的因子。但是只有第一个可以用二进制表示,因为10有5个因子,而不是2的因子。
在整数的情况下,它们都可以表示为分母为1的分数。由于1是所有整数的因子,任何整数都可以精确地表示在任何基数(包括2)中。