C++中针对size_t类型的ceil()和floor()函数

3

我有两个变量:

size_t a = 63;
size_t b = 32;

我调用了函数ceil(a/b)。自然而然地,我会认为答案返回2,但实际上它返回1

我感到困惑。我尝试将变量转换为doubleint,但似乎没有帮助。

谢谢任何帮助。


你是如何进行类型转换的?类型转换对我来说很正常... - goji
4个回答

3
让我们解释一下当你执行ceil(a/b)时会发生什么。首先,a和b之间进行整数除法运算,因此63/32变成(int)1,然后将1转换为double类型变成1.0,最后对1.0执行ceil操作,结果当然是1.0。
如果你期望得到2,需要在执行除法前将a和b转换为double类型,即ceil(double(a) / double(b))使用的是双精度除法。

1
“ceil”和“floor”函数适用于“double”类型。由于“size_t”是整数类型,您进行了整数除法,因此结果是整数(即已经是整数,因此无法向上或向下取整)。在执行除法之前尝试将其转换为“double”类型。保留html标签。
ceil( double(a) / double(b) );
floor( double(a) / double(b) );

从技术上讲,你只需要转换第一个,因为这样你将得到浮点除法。但是明确地转换两个是有好处的。


0

63和32都是整数,因此结果将是一个整数(即1而不是1.96875)。

要么按照Paddy指定的方式进行类型转换

或使用双精度值

ceil(63.0/32); // promotes 32 from int to double since one of the operand(63.0) is double.
ceil(63.0/32.0); // both operands are doubles

0

a/b 在这里执行整数除法,因为它们是整型,这将得到1。这就解释了为什么std::ceil返回你所看到的值。如果我们查看draft C++ standard5.6Multiplicative operators中的第4段话(注意:我加了强调):

二进制运算符/返回商,而二进制运算符%返回被第一个表达式除以第二个表达式后的余数。如果/或%的第二个操作数为零,则行为未定义。对于整数操作数,/运算符返回代数商并丢弃任何小数部分;[...]

因为在“表达式”段的第10条中,涵盖了“算术转换”,所以将任一操作数转换为double就足够了。该节代码为5强调下划线

许多希望期望算术或枚举类型的操作者会引起转换,并以类似的方式产生结果类型。其目的是产生一种常见类型,也是结果的类型。这种模式被称为通常的算术转换,定义如下:

其中包括:

否则,如果任一操作数是double,则另一个将被转换为double。

所以,以下表达式将产生所需的结果:

std::ceil( double(a)/b)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接