向上舍入具有非零十进制数字的浮点数(在C中)

时间:2014-03-02 04:37:00

标签: c rounding

我今天早些时候问了一半,并得到了@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()做同样的事情。谢谢!

3 个答案:

答案 0 :(得分:2)

除非你可靠地知道浮动的epsilon(我不确定标准C是否提供了这个),我认为你仍然坚持使用return (y < 0 || y == (int)y) ? y : y + 1;

答案 1 :(得分:1)

这对于负数而言是失败的。

int round_up(float y) {
 return y + 0.99999999;
}

但是让我们利用这一点对我们有利。 floatint次转化是截至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