C 将具有非零十进制数字的浮点数四舍五入

C 将具有非零十进制数字的浮点数四舍五入,c,rounding,ceil,C,Rounding,Ceil,今天早些时候,我问起了将数字四舍五入的问题,得到了@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; } 这适用于除浮点

今天早些时候,我问起了将数字四舍五入的问题,得到了@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为.0000000 1以外的所有情况。我想知道是否有更好的方法来做与C中的
ceil()
相同的事情。

除非您确实知道float的ε(我不确定标准C是否提供了这一点),否则我认为您必须使用
返回(y<0 | | y==(int)y)?y:y+1

除非您可靠地知道浮点的ε(我不确定标准C是否提供了这一点),否则我认为您必须使用
返回(y<0 | | y==(int)y)?y:y+1

除非您可靠地知道浮点的ε(我不确定标准C是否提供了这一点),否则我认为您必须使用
返回(y<0 | | y==(int)y)?y:y+1

除非您可靠地知道浮点的ε(我不确定标准C是否提供了这一点),否则我认为您必须使用
返回(y<0 | | y==(int)y)?y:y+1

对于负数,此操作失败

int round_up(float y) {
 return y + 0.99999999;
}
但让我们利用这一优势
float
int
的转换是向0.0的截断。因此,负数具有“向上取整”或“上限”功能。当我们有一个正的
float
时,转换为
int
,注意这是一个“floor”函数。当
y
不是整数时进行调整

(假设
y
INT\u MIN…INT\u MAX
范围内)

int-cell(浮动y){
if(y<0){
返回y;//这会在y<0时执行一个上限函数。
}
int i=y;//当y>=0时,它执行楼层功能。
如果(i!=y)i++;
返回i;
}
空芯试验(浮动y){
printf(“%f%d\n”,y,ceil(y));
}

对于负数,此操作失败

int round_up(float y) {
 return y + 0.99999999;
}
但让我们利用这一优势
float
int
的转换是向0.0的截断。因此,负数具有“向上取整”或“上限”功能。当我们有一个正的
float
时,转换为
int
,注意这是一个“floor”函数。当
y
不是整数时进行调整

(假设
y
INT\u MIN…INT\u MAX
范围内)

int-cell(浮动y){
if(y<0){
返回y;//这会在y<0时执行一个上限函数。
}
int i=y;//当y>=0时,它执行楼层功能。
如果(i!=y)i++;
返回i;
}
空芯试验(浮动y){
printf(“%f%d\n”,y,ceil(y));
}

对于负数,此操作失败

int round_up(float y) {
 return y + 0.99999999;
}
但让我们利用这一优势
float
int
的转换是向0.0的截断。因此,负数具有“向上取整”或“上限”功能。当我们有一个正的
float
时,转换为
int
,注意这是一个“floor”函数。当
y
不是整数时进行调整

(假设
y
INT\u MIN…INT\u MAX
范围内)

int-cell(浮动y){
if(y<0){
返回y;//这会在y<0时执行一个上限函数。
}
int i=y;//当y>=0时,它执行楼层功能。
如果(i!=y)i++;
返回i;
}
空芯试验(浮动y){
printf(“%f%d\n”,y,ceil(y));
}

对于负数,此操作失败

int round_up(float y) {
 return y + 0.99999999;
}
但让我们利用这一优势
float
int
的转换是向0.0的截断。因此,负数具有“向上取整”或“上限”功能。当我们有一个正的
float
时,转换为
int
,注意这是一个“floor”函数。当
y
不是整数时进行调整

(假设
y
INT\u MIN…INT\u MAX
范围内)

int-cell(浮动y){
if(y<0){
返回y;//这会在y<0时执行一个上限函数。
}
int i=y;//当y>=0时,它执行楼层功能。
如果(i!=y)i++;
返回i;
}
空芯试验(浮动y){
printf(“%f%d\n”,y,ceil(y));
}

对于负数,第一个代码段不正确-3.5将是-3,而不是-4。要正确地对值进行四舍五入,请使用

int round_number(float x)
{
    if (x >= 0)
        return x + 0.5f;
    else
        return x - 0.5f
}
即使这样,对于2个值来说仍然是不正确的。看见请注意,您需要使用
f
后缀来获取
float
文本,否则操作将以
double
精度完成,然后向下转换回
float

对于天花板,添加1就足够了

int ceiling(float x)
{
    if (x < 0 || (int)x == x)
        return x;
    else
        return x + 1.0f;
}
int天花板(浮动x)
{
如果(x<0 | |(int)x==x)
返回x;
其他的
返回x+1.0f;
}

当x是整数时,例如x=3.0(或-3.0),它返回3(或-3)。对于x=3.1,它返回4;对于x=-3.1,它返回-3。对于负数,第一个代码段的工作方式不正确-3.5将是-3,而不是-4。要正确地对值进行四舍五入,请使用

int round_number(float x)
{
    if (x >= 0)
        return x + 0.5f;
    else
        return x - 0.5f
}
即使这样,对于2个值来说仍然是不正确的。看见请注意,您需要使用
f
后缀来获取
float
文本,否则操作将以
double
精度完成,然后向下转换回
float

对于天花板,添加1就足够了

int ceiling(float x)
{
    if (x < 0 || (int)x == x)
        return x;
    else
        return x + 1.0f;
}
int天花板(浮动x)
{
如果(x<0 | |(int)x==x)
返回x;
其他的
返回x+1.0f;
}

当x是整数时,例如x=3.0(或-3.0),它返回3(或-3)。对于x=3.1,它返回4;对于x=-3.1,它返回-3。对于负数,第一个代码段的工作方式不正确-3.5将是-3,而不是-4。要正确地对值进行四舍五入,请使用

int round_number(float x)
{
    if (x >= 0)
        return x + 0.5f;
    else
        return x - 0.5f
}
即使这样,对于2个值来说仍然是不正确的。看见请注意,您需要使用
f
后缀来获取
float
文本,否则操作将以
double
精度完成,然后向下转换回
float