Число с плавающей запятой в 32 и 64-битное двоичное представление - PullRequest
0 голосов
/ 02 октября 2018

Мне нужно получить 64-битное двоичное представление (IEEE 754) некоторого значения с плавающей запятой (двойное значение).У меня есть этот код для 32-разрядного двоичного представления с плавающей точкой:

union
{
    float input;   // assumes sizeof(float) == sizeof(int)
    int   output;
}   data;
data.input = value;
std::bitset<sizeof(float) * CHAR_BIT>   bits(data.output);

Как объединение относится к преобразованию в этой ситуации?Почему я должен использовать это?Есть ли какой-нибудь симпатичный способ сделать то же самое, чтобы получить 64-битное представление?

1 Ответ

0 голосов
/ 02 октября 2018

Как объединение относится к обращению в этой ситуации?

В C11 вам разрешено использовать union s для выполнения "наложения типа", что является сутью вашего преобразования здесь: переосмысление битов, связанных с float, вместо этого как(подписанное, предполагаемое 32-разрядное) целое число.

Почему я должен его использовать?

Вы не должны использовать это.В C ++ это считается неопределенным поведением, и, хотя многие основные компиляторы будут поддерживать готовые штамповки на основе объединения, на них нельзя полагаться, чтобы они всегда обеспечивали это поведение, особенно когда стандартные изменения C ++ вбудущее.

Есть ли какой-нибудь симпатичный способ сделать то же самое, чтобы получить 64-битное представление?

Если ваш компилятор гарантирует наказание на основе объединения, то вам нужно толькозамените его соответствующим 64-битным целым числом:

static_assert(sizeof(double) == sizeof(uint64_t));
union {
    double input;
    uint64_t output;
} data;
data.input = value;
std::bitset<sizeof(double) * CHAR_BIT> bits(data.output);

Если этого не произойдет, то довольно способа сделать это не будет, но есть способ сделать это, гарантируяопределенное поведение:

static_assert(sizeof(double) == sizeof(uint64_t));
uint64_t output;
double input = value;
memcpy(output, input, sizeof(double));
std::bitset<sizeof(double) * CHAR_BIT> bits(output);
...