2

例如,我有一个浮点数 55.2f 并希望将其向下舍入,以便结果可以除以二而无需休息。

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

4

4 回答 4

9

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

float f=55.2f;
f=floorf(f/2.f)*2.f;
于 2012-09-03T14:46:45.303 回答
3

先转换为整数类型,如intor long,然后清除最低位。

float f = 55.2f;
int   i = (int)f & ~1;

解释

~表示按位求逆,即所有0位变为1,反之亦然。

所以,如果1有位模式

0...0001

然后~1

1...1110

(这里我...用来表示所有中间位,具体取决于您平台上整数的大小。)

当您&(按位与)您的整数与 时1...1110,您将保留除最低位之外的每个位的值,这被强制为0。如果您仍然不明白,请参阅按位 AND 运算符的说明。

通过强制最低位为0,您将数字向下舍入到最接近的偶数。

于 2012-09-03T14:46:41.933 回答
2

您可以编写自己的算法,例如使用位运算符。

以下代码可用于清除号码的最后一位。偶数确实没有设置最后一位。

int 
f(float x) 
{ 
    return (int)x & ~1; 
}
于 2012-09-03T14:47:16.127 回答
1

怎么样long int f = lrintf(x / 2);x你的浮标在哪里?

您也可以只说int f = x / 2;,但有些人认为这更昂贵,因为 C 标准要求特定的舍入模式,该模式可能是 CPU 原生的,也可能不是原生的。lrintf另一方面,该函数使用 CPU 的本机舍入模式。你需要#include <math.h>

于 2012-09-03T14:46:23.413 回答