有没有人知道方法/函数Int()
或floor()
是如何实现的?
我正在寻找各自的实现,因为以下内容适用于abs()
函数。
Int Abs (float x){
if x > 0
return x;
else
return -x
}
我在努力寻找解决方案,而不使用模数运算符。
答案 0 :(得分:18)
对我来说似乎
floor(n) = n - (n % 1)
应该这样做。
答案 1 :(得分:3)
使用IEEE 754 binary floating point representation一种可能的解决方案是:
float myFloor(float x)
{
if (x == 0.0)
return 0;
union
{
float input; // assumes sizeof(float) == sizeof(int)
int output;
} data;
data.input = x;
// get the exponent 23~30 bit
int exp = data.output & (255 << 23);
exp = exp >> 23;
// get the mantissa 0~22 bit
int man = data.output & ((1 << 23) - 1);
int pow = exp - 127;
int mulFactor = 1;
int i = abs(pow);
while (i--)
mulFactor *= 2;
unsigned long long denominator = 1 << 23;
unsigned long long numerator = man + denominator;
// most significant bit represents the sign of the number
bool negative = (data.output >> 31) != 0;
if (pow < 0)
denominator *= mulFactor;
else
numerator *= mulFactor;
float res = 0.0;
while (numerator >= denominator) {
res++;
numerator -= denominator;
}
if (negative) {
res = -res;
if (numerator != 0)
res -= 1;
}
return res;
}
int main(int /*argc*/, char **/*argv*/)
{
cout << myFloor(-1234.01234) << " " << floor(-1234.01234) << endl;
return 0;
}
答案 2 :(得分:3)
private static int fastFloor(double x) {
int xi = (int)x;
return x < xi ? xi - 1 : xi;
}
这是一种类似于Michal Crzardybons答案的方法,但它避免了条件分支,仍能正确处理负数。
答案 3 :(得分:1)
如果'int'类型的结果足够,那么这里有一个简单的替代方法:
int ifloor( float x )
{
if (x >= 0)
{
return (int)x;
}
else
{
int y = (int)x;
return ((float)y == x) ? y : y - 1;
}
}
答案 4 :(得分:0)
int(x) = x - x%1
floor(x) = int(x)-(x<0 && x%1!=0)
ceil(x) = int(x)+(x>0 && x%1!=0)
round(x) = floor(x)+(x>0&&x%1>=0.5)+(x<0&&(1+x%1)%1>=0.5)
注意::round(x)
未实现为floor(x+0.5)
,因为它将在x=0.5-2^-54
处失败
注意:假设逻辑运算将整数转换为1(表示true)和0(表示false)
答案 5 :(得分:0)
最佳答案不适用于负数,因此我对其进行了修改:
floor(n) = n - (n % 1 >= 0 ? n%1: (1 + n % 1))
ceil(n) = -floor(-n)