2015-05-09 10 views
0

, поэтому я получил задание, в котором мне нужно извлечь знак, показатель экспоненты и мантиссы из числа с плавающей запятой, заданного как uint32_t. Я должен сделать это на C и, как вы могли бы ожидать, как мне это сделать?Как извлечь знак, мантисса и экспонента из 32-битного поплавка

Для знака я бы искать в MSB (старший бит, так как он говорит мне ли мой номер является положительным или отрицательным, в зависимости, если это 0 или 1)

Или давайте прямо к моей идее, может Я «сплайсирую» мое 32-битное число на три части?

Получите 1 бит MSB/знак Тогда после этого следует 1 байт, который выступает за показателем и в последние 23 бита для мантиссы

Это, вероятно, не работает так, но вы можете дать мне подсказка/решение? Я знаю о freexp, но мне нужна альтернатива, где я узнаю немного больше C. Спасибо.

+1

применить побитовые операции –

ответ

2

Если вы знаете побитовое макет вашего типа с плавающей точкой (например, потому что ваша реализация поддерживает IEEE с плавающей точкой представления), а затем преобразовать указатель на вашей плавающей точкой переменной (типа float, double или long double) в указатель на unsigned char , Оттуда обрабатывайте переменную как массив из unsigned char и используйте побитовые операции для извлечения необходимых вам частей.

В противном случае сделайте это;

#include <math.h> 

    int main() 
    { 
     double x = 4.25E12; /* value picked at random */ 

     double significand; 
     int exponent; 
     int sign; 

     sign = (x >= 0) ? 1 : -1; /* deem 0 to be positive sign */ 
     significand = frexp(x, &exponent); 
    } 

Расчет sign в выше должно быть очевидно.

significand может быть положительным или отрицательным, для ненулевого x. Абсолютное значение significand находится в диапазоне [0.5,1), которое при умножении на 2 на мощность exponent дает исходное значение.

Если x является 0, как exponent и significand будет 0.

Это будет работать независимо от того, какие представления с плавающей запятой поддерживает ваш компилятор (при условии значений double).

+0

Для первой части вы имеете в виду, если у вас есть 'float x' и' float * p_x = (float *) & x' .. как вы можете преобразовать его в указатель на 'unsigned char'? Например: 'unsigned char * ucp_x = (unsigned char *) p_x'? – galois

+0

Это один из способов. – Peter

+0

Тогда как бы вы получили к нему доступ «как массив»? – galois