floor()和ceil()函数与C中转换为整数的比较

floor()和ceil()函数与C中转换为整数的比较,c,casting,floor,ceil,C,Casting,Floor,Ceil,我正在编写一些C代码来反复地将浮点上下取整为整数值。 标准C数学库包括函数floor()和ceil()。 我注意到,函数的更快实现是直接转换为整数: int up, down; float test = 1.3548; up = (int)(test + 1); //ceil() down = (int)test; //floor() 我做了一个快速检查,这似乎工作良好 如果我需要一个整数作为数组索引,那么这是一种可靠的上下取整方法吗(即,它是否总是返回正确的结果) 速度的显著提

我正在编写一些C代码来反复地将浮点上下取整为整数值。 标准C数学库包括函数
floor()
ceil()
。 我注意到,函数的更快实现是直接转换为整数:

int up, down;
float test = 1.3548;

up = (int)(test + 1);  //ceil()
down  = (int)test;     //floor()
我做了一个快速检查,这似乎工作良好

  • 如果我需要一个整数作为数组索引,那么这是一种可靠的上下取整方法吗(即,它是否总是返回正确的结果)
  • 速度的显著提高是否有充分的理由?(在我的系统上,它的运行速度大约是math.h实现的3倍)
  • 函数
    ceil()
    floor()
    返回的数字与使用

    up = (int)(test + 1);
    down  = (int)test;
    
    当你有一个负数

    如果您有:

    float test = -1.3548;
    up = (int)test;        // ceil()
    down = (int)(test-1);  // floor()
    
    test
    为整数时,即使最后一条语句也不是计算
    floor()
    的好方法


    除非您希望以不同的方式处理正数和负数,并且在特殊情况下,
    test
    是整数,否则最好使用
    ceil()
    floor()

    这不是一种可靠的方法。考虑<代码>测试< /COD>是整型值的情况,如<代码> 4 < /代码>。在这种情况下,
    floor(x)=ceil(x)
    ,但您的代码将返回
    up=5;down=4
    。您确定速度更快吗?让我们看看你的性能测试!这取决于你所说的“可靠”是什么意思。如果“可靠”意味着“它会工作”,那么,是的。但是如果你的意思是更多的,比如“它总是向下/向上/最近/接近零/等等”,那么,不。。。确保对正数和负数以及那些可能超出
    int
    范围的数字尝试各种方法,以查看发生了什么,以便您可以针对特定情况选择“正确”的方法。。。哦,这应该是
    up=(int)(test+0.5)
    -想想看……如果您不关心较旧的处理器,请使用SSE4.1编译。然后
    floor()
    ceil()
    就不会再慢了。对于
    round()
    使用:
    (int)(test+0.5f)
    (int)(test-1)
    对于整数负数与
    floor()
    不等价。@Iggy for“for round()use:(int)(test+0.5f)”对于负数失败。