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