有沒有人有一個想法如何實現方法/函數Int()
或floor()
? 我正在尋找相應的實現,因爲以下是abs()
函數。floor()/ int()函數的實現
Int Abs (float x){
if x > 0
return x;
else
return -x
}
我在努力爲它找到一個解決方案,而無需使用模運算符。
有沒有人有一個想法如何實現方法/函數Int()
或floor()
? 我正在尋找相應的實現,因爲以下是abs()
函數。floor()/ int()函數的實現
Int Abs (float x){
if x > 0
return x;
else
return -x
}
我在努力爲它找到一個解決方案,而無需使用模運算符。
使用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.) << " " << floor(-1234.) << endl;
return 0;
}
這與[Michal's](http://stackoverflow.com/a/6437076/774086),[Seronis's](http://stackoverflow.com/a/26091248/774086)和[TheJubilex's](http: //stackoverflow.com/a/5123037/774086)答案? –
如果類型的 'INT' 的結果是足夠的,則這裏是一個簡單的選擇:
int ifloor(float x)
{
if (x >= 0)
{
return (int)x;
}
else
{
int y = (int)x;
return ((float)y == x) ? y : y - 1;
}
}
一個跡象表明,爲什麼在這個世界上你需要這個會很好。 –