Хорошо, у меня раньше такое случалось, когда переменные случайным образом меняли числа из-за проблем с выделением памяти или неправильной адресации и т. Д., Например, когда вы выходили за пределы массива. Однако я не использую массивы, указатели или адреса, поэтому не знаю, почему после выполнения этого цикла он вдруг решает, что «показатель степени» после установки в 0
равен 288
внутри цикла:
РЕДАКТИРОВАТЬ: Он решает разбить конкретно: 0x80800000
.
Это не прерывается в одном тесте , у нас есть «тестирующий» клиент, который повторяет несколько тестовых случаев, каждый раз, когда он вызывает его снова, каждый раз, когда функция вызывается снова, значения должны быть установлены равны их исходным значениям.
/*
* float_i2f - Return bit-level equivalent of expression (float) x
* Result is returned as unsigned int, but
* it is to be interpreted as the bit-level representation of a
* single-precision floating point values.
* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while
* Max ops: 30
* Rating: 4
*/
unsigned float_i2f(int x) {
int sign= 0;
int a=0;
int exponent=0;
int crash_test=0;
int exp=0;
int fraction=0;
int counter=0;
if (x == 0) return 0;
if (!(x ^ (0x01 << 31)))
{
return 0xCF << 24;
}
if (x>>31)
{
sign = 0xFF << 31;
x = (~x) + 1;
}
else
{
sign = 0x00;
}
//printf(" After : %x ", x);
a = 1;
exponent = 0;
crash_test = 0;
while ((a*2) <= x)
{
if (a == 0) a =1;
if (a == 1) crash_test = exponent;
/*
if(exponent == 288)
{exponent =0;
counter ++;
if(counter <=2)
printf("WENT OVERBOARD WTF %d ORIGINAL %d", a, crash_test);
}
*/
if (exponent > 300) break;
exponent ++;
a *= 2;
}
exp = (exponent + 0x7F) << 23;
fraction = (~(((0x01)<< 31) >> 7)) & (x << (25 - (exponent + 1)));
return sign | exp | fraction;
}