Без использования бросков или функциональности библиотек я должен отличать целое число с поплавком с манипуляциями с битами. Ниже приведен код, над которым я сейчас работаю. Он основан на коде, который я нашел в Cast Integer to Float using Bit Manipulation breaks on some integers in C. Проблема, с которой я столкнулся, включает стандарты округления в IEEE 754. В частности, мой код округляется до нуля, но он должен округлять до четных чисел. Какие изменения мне нужно сделать?IEEE 754 Бит-манипуляция Ошибка округления
unsigned inttofloat(int x) {
int bias = 127;
int man;
int exp = bias + 31; //8-bit exp
int count = 0;
int tmin = 1 << 31;
int manpattern = 0x7FFFFF;
int sign = 0;
if (x == 0){
return 0;
}
else if (x == tmin){
return 0xcf << 24;
}
if (x < 0) {
sign = tmin;
x = ~x + 1; // makes x negative so that we can accurately represent it later on.
}
while((x & tmin) == 0){
exp--;
x <<= 1;
count++;
}
exp <<= 23;
man = (x >> 8) & manpattern;
return (sign | exp | man);
}
'int tmin = 1 << 31;' неопределенное поведение в реализации, где 'int' имеет менее 33 бит. – EOF
Как это? В C99 говорится, что сдвиг размера слова минус 1 разрешен там, где это именно так. У меня есть 32 бита в моем целочисленном числе, поэтому 31 сдвиг влево все еще четко определен. –
Вот статья, которая объясняет именно это @EOF http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html –