浮点数向下取整
浏览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