Как преобразовать неподписанное int в число с плавающей точкой?
Мне нужно построить функцию, которая возвращает битовый эквивалент (float) x без использования каких-либо плавающих типов данных, операций или констант. Я думаю, что у меня есть, но когда я запускаю тестовый файл, он возвращает, что есть бесконечный цикл. Любая помощь отладки будет принята с благодарностью.
Мне разрешено использовать любые целочисленные / беззнаковые операции, включая ||, &&, если, while. Кроме того, я могу использовать только 30 операций
unsigned float_i2f(int x) {
printf("\n%i", x);
if (!x) {return x;}
int mask1 = (x >> 31);
int mask2 = (1 << 31);
int sign = x & mask2;
int complement = ~x + 1;
//int abs = (~mask1 & x) + (mask1 & complement);
int abs = x;
int i = 0, temp = 0;
while (!(temp & mask2)){
temp = (abs <<i);
i = i + 1;
}
int E = 32 - i;
int exp = 127 + E;
abs = abs & (-1 ^ (1 << E));
int frac;
if ((23 - E)>0)
frac = (abs << (23 - E));
else
frac = (abs >> (E - 23));
int rep = sign + (exp << 23) + frac;
return rep;
}
В ответ на очень полезные комментарии и ответы, вот обновленный код, который теперь работает только для 0x80000000:
unsigned float_i2f(int x) {
int sign;
int absX;
int E = -1;
int shift;
int exp;
int frac;
// zero is the same in int and float:
if (!x) {return x;}
// sign is bit 31: that bit should just be transferred to the float:
sign = x & 0x80000000;
// if number is < 0, take two's complement:
if (sign != 0) {
absX = ~x + 1;
}
else
absX = x;
shift = absX;
while ((!!shift) && (shift != -1)) {
//std::cout << std::bitset<32>(shift) << "\n";
E++;
shift = (shift >> 1);
}
if (E == 30) { E++;}
exp = E + 127+24;
exp = (exp << 23);
frac = (absX << (23 - E)) & 0x007FFFFF;
return sign + exp + frac;
}
Кто-нибудь есть идеи, где ошибка в пересмотренном коде? Спасибо всем еще раз!