浮点数向下取整
浏览opencv源码时,看到了cvFloor函数,其中的向下取整很有意思。
CV_INLINE int cvFloor( double value )
{
#if defined CV__FASTMATH_ENABLE_GCC_MATH_BUILTINS || \
defined CV__FASTMATH_ENABLE_CLANG_MATH_BUILTINS
return (int)__builtin_floor(value);
#elif defined __loongarch64
int i;
double tmp;
__asm__ ("ftintrm.l.d %[tmp], %[in] \n\t"
"movfr2gr.d %[i], %[tmp] \n\t"
: [i] "=r" (i), [tmp] "=f" (tmp)
: [in] "f" (value)
:);
return i;
#else
int i = (int)value;
return i - (i > value);
#endif
}
简化一下以上代码:
//首先,代码中将参数value强制转换为int类型,赋值给变量i。
//然后,代码中使用了三元运算符,判断i是否大于value,如果是,则返回i-1,否则返回i。这样的操作可以实现向下取整的效果,将小数部分直接舍去。
//最终,函数返回经过向下取整处理后的整数值。
int quzheng(double value)
{
int i = (int)value;
return i - (i > value);
}
测试案例
int main() {
double a = 1.01;
cout << quzheng(a) << endl;
double b = 0.99;
cout << quzheng(b) << endl;
double c = 1.5;
cout << quzheng(c) << endl;
return 0;
}
测试结果:
1
0
1
浮点数向上取整
反之,可以反推出向上取整。
int quzheng(double value)
{
int i = (int)value;
return i + (i < value);
}
测试案例同上:
。。。。
测试结果:
2
1
2