例如,我有一个浮动55.2f,并希望将其向下舍入,以便结果可以除以2而不休息。
因此,55.2将变为54,因为这是最接近的较小“步”,可以除以2。有这个函数还是我必须编写自己的算法?
答案 0 :(得分:9)
如果您的结果必须保持为float
,则可以执行以下操作:
float f=55.2f;
f=floorf(f/2.f)*2.f;
答案 1 :(得分:3)
首先转换为整数类型,例如int
或long
,然后清除最低位。
float f = 55.2f;
int i = (int)f & ~1;
<强>解释强>
~
表示按位反转,即所有0
位变为1
,反之亦然。
因此,如果1
具有位模式
0...0001
然后~1
1...1110
(这里我使用...
来表示所有中间位,具体取决于平台上的整数大小。)
当&
(按位AND)带有1...1110
的整数时,除了最低位(强制为0
)之外,您保留每个位的值。如果你还没有得到它,请参见this description of the bitwise AND operator。
通过强制最低位为0
,您将数字四舍五入为最接近的偶数。
答案 2 :(得分:2)
您可以编写自己的算法,例如使用按位运算符。
以下代码适用于清除号码的最后一位。确实是最后一位没有设置偶数。
int
f(float x)
{
return (int)x & ~1;
}
答案 3 :(得分:1)
long int f = lrintf(x / 2);
怎么样,x
是你的浮动?
你也可以说int f = x / 2;
,但是有些人认为这更昂贵,因为C标准要求特定的舍入模式,这可能是也可能不是CPU的原生模式。另一方面,lrintf
函数使用CPU的本机舍入模式。您需要#include <math.h>
。