2016-02-26 16 views
-2

Я только начал изучать с плавающей точкой и познакомиться с материалом МСП. Я все еще очень смущен о мантиссе ... Может кто-нибудь объяснить мне, как я могу получить часть экспансии поплавка. Прошу прощения, если это супер глупый и основной вопрос, но мне трудно это понять ...получить показания числа с плавающей точкой

Также как реализовать следующую функцию ... ясно, что моя реализация неверна. Но как мне это сделать?

// Extract the 8-bit exponent field of single precision 
// floating point number f and return it as an unsigned byte 
unsigned char get_exponent_field(float f) 
{ 
// TODO: Your code here. 
int bias = 127; 
int expp = (int)f; 
unsigned char E = expp-bias; 

return E; 
} 
+2

Вы искали? Любая из ссылок «Ссылки» (справа) помогает? Например, [Как получить знак, мантисса и показатель числа с плавающей запятой] (https://stackoverflow.com/questions/15685181/how-to-get-the-sign-mantissa-and-exponent-of-a -floating-точка-номер). – kaylum

+0

Биты экспоненты в '' float' '- бит от 1 до 8 (0-й бит для знака), используйте бит-сдвиг и бит-маску для его получения. – Ian

ответ

0

Прежде всего, получите свое число с плавающей запятой и вычислите его двоичную форму, разделив как целую, так и дробную части отдельно. Как только у вас получится, скажите, что у вас 11010.101 (base-2). Normalize двоичная строка: 1.1010101 x 2^4. Затем добавьте свое избыточное значение, скажем, избыток 15, к экспоненте sci. не. значение, которое даст вам 19 (базовая-десять). Преобразуйте это в base-two; это будет вашим показателем.

Это только структура операции, подключите в собственной предвзятости и т.д.

1

Если вы хотите, чтобы извлечь IEEE-754 с одинарной точностью показателя от значения floatизбыточной 127 нотации), вы можете использовать функции с плавающей точкой, или вы можете использовать простой союз с сдвига и маски сделать то же самое:

unsigned float_getexp (float f) 
{ 
    union { 
     unsigned u; 
     float f; 
    } uf; 
    uf.f = f; 
    return (uf.u >> 23) & 0xff; 
} 

Если вы хотите, чтобы фактический показатель смещал (т. число мест, в которых десятичная метка мантиссы сдвигается во время нормализации до удаления , удаляет скрытый бит), просто вычтите 127 из возвращаемого значения или если вы хотите вернуть это значение, вычтите его перед возвратом.

Попробуйте и дайте мне знать, если у вас есть вопросы. (примечание:type должно быть unsigned для вашего экспонента, а не int у вас есть).

+0

Привет, вы можете объяснить, как этот uf.u получает значение и что означает & 0xff? –

+0

Конечно. Все, что вы ищете, это функция 'float_getexp'. Внутри функции первая переменная является 'union' с именем' uf' (с 'unsigned 'и' float' - как 32 бит на большинстве аппаратных средств x86). Сразу после того, как объявлен 'union' с именем' uf', профсоюзу присваивается значение (переданное как параметр функции) в 'uf.f = f;' (это стандартный * точечный оператор * член 'struct/union' ссылаясь, например, 'uf.f' ссылается на float-член объединения). Затем 'unsigned' member' uf.u' имеет сдвиг вправо 23 бита и возвращаются 2 байты, которые представляют экспоненту. –

Смежные вопросы