Using the IEEE 754 floating point binary representation , one possible solution:
float myFloor(float x)
{
if (x == 0.0)
return 0;
union
{
float input;
int output;
} data;
data.input = x;
int exp = data.output & (255 << 23);
exp = exp >> 23;
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;
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 , char **)
{
cout << myFloor(-1234.01234) << " " << floor(-1234.01234) << endl;
return 0;
}
source
share