我今天早些时候问了一半,并得到了@alk的大力帮助。在那篇文章中,我的想法是向上舍入4.5到5,但是回合4.4到4,而@alk给出的解决方案是:
int round_number(float x)
{
return x + 0.5;
}
它非常优雅!
在这篇文章中,我想讨论如何在C中实现ceil()函数。 与@alk给出的最后一个解决方案一样,我想出了以下内容:
int round_up(float y)
{
return y + 0.99999999;
}
这适用于所有情况,除非浮点数y具有.00000001。我想知道是否有更好的方法与C中的ceil()做同样的事情。谢谢!
答案 0 :(得分:2)
除非你可靠地知道浮动的epsilon(我不确定标准C是否提供了这个),我认为你仍然坚持使用return (y < 0 || y == (int)y) ? y : y + 1;
答案 1 :(得分:1)
这对于负数而言是失败的。
int round_up(float y) {
return y + 0.99999999;
}
但是让我们利用这一点对我们有利。 float
到int
次转化是截至0.0的截断。因此,负数正在进行“向上舍入”或“上限”功能。如果我们有正float
,请转换为int
,注意这是一个“楼层”功能。 y
不是整数时调整。
(在y
中假设INT_MIN ... INT_MAX
。)
int ceil(float y) {
if (y < 0) {
return y; // this does a ceiling function as y < 0.
}
int i = y; // this does a floor function as y >= 0.
if (i != y) i++;
return i;
}
void ceil_test(float y) {
printf("%f %d\n", y, ceil(y));
}
答案 2 :(得分:0)
第一个代码段对于负数不正确。 -3.5将来-3,而不是-4
int round_number(float x)
{
if (x >= 0)
return x + 0.5;
else
return x - 0.5
}
对于天花板,添加1就足够了
int ceiling(float x)
{
if (x < 0 || (int)x == x)
return x;
else
return x + 1.0;
}
当x = 3.0 o(r -3.0)时,返回3(-3)。对于x = 3.1,它返回4,对于x = -3.1,它返回-3