2013-05-02 2 views
2

У меня есть функция, которая вычисляет представление с плавающей запятой 2^x. Я понимаю, большую часть своей стороны, однако я столкнулся некоторое замешательство на вложенное заявлении, если-то еще из этой функции:понимание представления с плавающей запятой 2^x

/* Compute 2**x */ 
float fpwr2(int x) { 

    unsigned exp, frac; 
    unsigned u; 

    if (x < -149) { 
    /* Too small. Return 0.0 */ 
    exp = 0; 
    frac = 0; 
    } else if (x < -126) { 
    /* Denormalized result */ 
    exp = 0; 
    frac = 1 << (x + 149); 
    } else if (x < 128) { 
    /* Normalized result. */ 
    exp = x + 127; 
    frac = 0; 
    } else { 
    /* Too big. Return +oo */ 
    exp = 255; 
    frac = 0; 
    } 
    u = exp << 23 | frac; 
    return u2f(u); 
} 

мой вопрос, почему эти конкретные цифры (-149, -126128) выбрана? Если, я вычислил 64-битное представление с плавающей запятой 2^x, изменились ли эти числа? thx

ответ

3

См. определение single-precision floating point number.

Диапазон от -126 до 127 - показатель степени, который может быть закодирован в формате. Все, что меньше -126, будет денормализировано, потому что во фракционной части не будет достаточного количества бит, и что-либо большее 127 (то есть >= 128) не может быть представлено вообще.

В части дроби имеется 23 бита, поэтому денормализованное значение может быть между 2^(- 126-1) и 2^(- 126 - 23). -126 - 23 = -149.

Да значения будут меняться с помощью 64-bit floating point number - диапазон экспонентов от -1022 до 1023, а во фракции 52 бит.

1

Эти цифры основаны на 32-битном представлении с плавающей запятой, который имеет 8 бит экспоненты, 23 бит мантиссы и 1 бит знака. Это позволяет экспоненту варьироваться от -126 до 127 (-127 используется для денормализованных чисел), но вам нужно добавить 127 к нему, чтобы получить значение без знака, используемое в битовой арифметике. Когда вы разрешаете денормализацию, вы можете получить меньшие числа, изменив значение в мантиссе; так как есть 23 бит мантиссы, это позволяет спуститься до показателя -126-23 = -149.

Если вы делаете 64-битную точку с плавающей запятой, вы должны увеличить их в размере соответствующих полей. Например. если это 16 бит экспоненты и 47 бит мантиссы, они будут -65581, -65534 и 65535.

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