2

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))  

那是对的吗?

4

2 回答 2

3

没有 [simple] 单一定义lrint来执行 C99 标准定义的行为。这是因为 的行为lrint由对 的单独调用控制fesetround。相反,您应该为应用程序的所需行为使用具有保证语义的单独舍入函数。

于 2013-03-10T06:26:19.830 回答
0
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));
于 2014-11-11T15:29:56.463 回答