为什么“ceil()”函数的返回类型是“double”而不是某种整数类型?

时间:2017-01-23 12:28:03

标签: c types type-conversion

我刚刚实现了一行代码,其中需要分割两个数字,结果需要四舍五入到下一个整数。我开始非常天真:

i_quotient = ceil(a/b);

由于数字ab都是整数,这不起作用:除法作为整数除法执行,默认情况下向下舍入,所以我需要强制除法成为浮点运算:

i_quotient = ceil((double) a / b);

现在这似乎有效,但它留下了一个警告,说我正在尝试将一个double分配给一个整数,实际上,在头文件“math.h”后面是ceil()函数的返回类型是“双重”,现在我迷失了:返回双倍的舍入函数的意义是什么?任何人都可以告诉我这个吗?

5 个答案:

答案 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 >= 0b > 0时OP的大多数情况。如果ab为否定或a + b - 1可能会溢出,则需要考虑其他因素。

答案 4 :(得分:0)

将技术讨论区分开来,难道不能仅仅是为了保持一致性吗?

如果函数采用double形式,则在没有特殊原因返回其他类型的情况下,应返回相同类型的结果。 用户可以根据需要将其转换为整数。 毕竟,您可能只在应用程序中使用double。

尽管ceil表示四舍五入到下一个整数,但这并不完全意味着它是一个整数,很显然,整数是一个整数,但不必损害我们的思维