Я видел ваш вопрос и вспомнил некоторый код для эмуляции с плавающей запятой, который я написал давно. Прежде всего, очень важный совет для чисел с плавающей запятой. Прочитайте «Что каждый программист должен знать о плавающей точке» , это очень хорошее и полное руководство по теме.
Что касается моего кода, я покопался в нем и нашел его, но должен предупредить вас, что он уродлив, и поскольку он был для личного проекта (мой тезис старшекурсника), он не прокомментирован должным образом. Также у кода могут быть определенные особенности, поскольку он предназначен для встроенной системы (робота). Ссылка на страницу, которая объясняет проект и содержит ссылку для загрузки кода: здесь . Я не против веб-сайта, я не веб-дизайнер. Боюсь:)
Вот как я представлял числа с плавающей точкой в этом проекте:
typedef struct
{
union{
struct {
unsigned long mantissa: 23;
unsigned long exponent: 8;
unsigned long sign: 1;
} float_parts; //the struct shares same memory space as the float
//allowing us to access its parts with the bitfields
float all;
};
}_float __attribute__((__packed__));
Используются битовые поля , объяснение которых, я думаю, выходит за рамки темы, поэтому обратитесь к ссылке, если вы хотите узнать больше информации.
То, что вас там заинтересовало бы, я полагаю, это функция. Обратите внимание, что код написан не очень хорошо, и я не смотрю на него годами. Также обратите внимание, что, поскольку я предназначался только для архитектуры конкретного робота, в коде нет проверок на бесконечность. Но в любом случае я надеюсь, что это пригодится вам.
_float intToFloat(int number)
{
int i;
//will hold the resulting float
_float result;
//depending on the number's sign determine the floating number's sign
if(number > 0)
result.float_parts.sign = 0;
else if(number < 0)
{
number *= -1; //since it would have been in twos complements
//being negative and all
result.float_parts.sign = 1;
}
else // 0 is kind of a special case
{
parseFloat(0.0,&result);
return result;
}
//get the individual bytes (not considering endiannes here, since it is for the robot only for now)
unsigned char* bytes= (unsigned char*)&number;
//we have to get the most significant bit of the int
for(i = 31; i >=0; i --)
{
if(bytes[i/8] & (0x01 << (i-((i/8)*8))))
break;
}
//and adding the bias, input it into the exponent of the float
//because the exponent says where the decimal (or binary) point is placed relative to the beginning of the mantissa
result.float_parts.exponent = i+127;
//now let's prepare for mantissa calculation
result.float_parts.mantissa = (bytes[2] << 16 | bytes[1] << 8 | bytes[0]);
//actual calculation of the mantissa
i= 0;
while(!(result.float_parts.mantissa & (0x01<<22)) && i<23) //the i is to make sure that
{ //for all zero mantissas we don't
result.float_parts.mantissa <<=1; //get infinite loop
i++;
}
result.float_parts.mantissa <<=1;
//finally we got the number
return result;
}