我刚刚实现了一行代码,其中需要分割两个数字,结果需要四舍五入到下一个整数。我开始非常天真:
i_quotient = ceil(a/b);
由于数字a
和b
都是整数,这不起作用:除法作为整数除法执行,默认情况下向下舍入,所以我需要强制除法成为浮点运算:
i_quotient = ceil((double) a / b);
现在这似乎有效,但它留下了一个警告,说我正在尝试将一个double分配给一个整数,实际上,在头文件“math.h”后面是ceil()
函数的返回类型是“双重”,现在我迷失了:返回双倍的舍入函数的意义是什么?任何人都可以告诉我这个吗?
答案 0 :(得分:7)
double的范围可以大于任何整数类型。
返回double
是确保结果类型具有可以处理所有可能输入的范围的唯一方法。
答案 1 :(得分:3)
ceil()
以double
为参数。那么,如果它返回一个整数,你会选择哪个整数类型仍然可以代表它的ceiled值?
无论什么类型,它应该能够代表所有可能的双重值。
可以保持最高可能值的整数类型是uintmax_t
。
但即使在某些实现中,它也不能保证它可以保存所有 double 值。
因此,为double
返回ceil()
值是有意义的。如果需要整数值,则调用者总是可以将其强制转换为所需的整数类型。
答案 2 :(得分:1)
因为它为什么要这样?转换为int和double需要时间。这种开销可能变得很重要。如果要将double转换为int,请执行以下操作:
i_quotient = (int)ceil((double) a / b);
如果您想了解有关此延迟的更多信息,请检查this answer。您必须考虑C退出旧,可实现的性能是最重要的优先事项之一。但即使C#和其他现代语言通常也会为了ceil而返回ceil的浮动值。
答案 3 :(得分:0)
OP以两个整数a,b
开头,并质疑为什么函数double ceil(double)
采用double
,不会返回某种整数类型。
大多数浮点数学函数采用浮点参数并返回相同的类型。
double ceil(double)
不返回整数类型的一个重要原因是因为很少需要有限的功能。整数类型具有(或几乎总是)具有double
的更有限范围。预计ceil(DBL_MAX)
不适合整数类型。
需要使用double
数学来解决整数问题。
如果代码需要除以整数并向上舍入商,请使用folllwing。价:@mch
i_quotient = (a + b - 1) / b;
以上内容将处理a >= 0
和b > 0
时OP的大多数情况。如果a
或b
为否定或a + b - 1
可能会溢出,则需要考虑其他因素。
答案 4 :(得分:0)
将技术讨论区分开来,难道不能仅仅是为了保持一致性吗?
如果函数采用double形式,则在没有特殊原因返回其他类型的情况下,应返回相同类型的结果。 用户可以根据需要将其转换为整数。 毕竟,您可能只在应用程序中使用double。
尽管ceil
表示四舍五入到下一个整数,但这并不完全意味着它是一个整数,很显然,整数是一个整数,但不必损害我们的思维