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