如何将浮点数舍入到最接近的值,可以除以2而不休息?

时间:2012-09-03 14:44:06

标签: objective-c c

例如,我有一个浮动55.2f,并希望将其向下舍入,以便结果可以除以2而不休息。

因此,55.2将变为54,因为这是最接近的较小“步”,可以除以2。有这个函数还是我必须编写自己的算法?

4 个答案:

答案 0 :(得分:9)

如果您的结果必须保持为float,则可以执行以下操作:

float f=55.2f;
f=floorf(f/2.f)*2.f;

答案 1 :(得分:3)

首先转换为整数类型,例如intlong,然后清除最低位。

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>