Понимание двоичного представления с плавающей точкой - PullRequest
2 голосов
/ 06 июня 2019

Я использую следующий код для распечатки «двоичного представления» числа с плавающей запятой:

template<class F>
void printBinary(F value)
{
    std::cout <<
        std::bitset<sizeof(F) * 8>(*reinterpret_cast<unsigned long*>(&value)).to_string()
    << std::endl;
}

int main()
{
    float f = 1;
    printBinary(f);
    f = 2;
    printBinary(f);
    f = 3;
    printBinary(f);
    f = 4;
    printBinary(f);
    f = 16;
    printBinary(f);
    f = 0.2;
    printBinary(f);
}

Это выводит:

00111111100000000000000000000000
01000000000000000000000000000000
01000000010000000000000000000000
01000000100000000000000000000000
01000001100000000000000000000000
00111110010011001100110011001101

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

Заранее спасибо.

1 Ответ

4 голосов
/ 06 июня 2019

Предполагая, что вы ссылаетесь на двоичный формат IEEE754 с плавающей запятой, 32-разрядное число с плавающей запятой состоит из 1 знакового бита, 8 экспоненциальных битов и 23 значащих (или дробных) битов.Вот как представлен один из ваших примеров 0.2, например:

                  3  2          1         0
                  1 09876543 21098765432109876543210
                  S ---E8--- ----------F23----------
          Binary: 0 01111100 10011001100110011001101
             Hex: 3E4C CCCD
       Precision: SP
            Sign: Positive
        Exponent: -3 (Stored: 124, Bias: 127)
       Hex-float: +0x1.99999ap-3
           Value: +0.2 (NORMAL)

Подробнее о самом формате можно прочитать на странице википедии: https://en.wikipedia.org/wiki/IEEE_754#Basic_and_interchange_formats, а также о спецификеФормат с одинарной точностью: https://en.wikipedia.org/wiki/Single-precision_floating-point_format

...