windows中C99 lrint函数的正确替代方法是什么?
#define lrint(x) (floor(x+(x>0) ? 0.5 : -0.5))
/* and if fesetround(0) behavior is required*/
#define lrint(x) ((int)(x))
那是对的吗?
没有 [simple] 单一定义lrint
来执行 C99 标准定义的行为。这是因为 的行为lrint
由对 的单独调用控制fesetround
。相反,您应该为应用程序的所需行为使用具有保证语义的单独舍入函数。
floor(x+(x>0) ? 0.5 : -0.5)
只会正确舍入正数,而不是负数,因为 floor() 向负无穷大舍入,这意味着 floor(-7.1)=-8 ,并且引用的代码不能解决这个问题: floor(-7.1-0.5)= -8 仍然,而正确舍入到最接近的整数必须导致 -7。以下代码可以正确舍入:
return int(x + ((x >= 0.0) ? 0.5 : -0.5));
或者,
return ((x >= 0.0) ? floor(x+0.5) : ceil(x-0.5));