Подтвердить что ты не робот

Обеспечение удваивания С++ - 64 бита

В моей программе на С++ мне нужно вывести 64-битный float из внешней байтовой последовательности. Есть ли способ обеспечить во время компиляции удвоение 64 бит? Есть ли другой тип, который я должен использовать для хранения данных?

Изменить: если вы читаете это и фактически ищете способ обеспечить хранение в формате IEEE 754, посмотрите на ответ Адама Розенфилда ниже.

4b9b3361

Ответ 1

Улучшение других ответов (которые предполагают, что char составляет 8 бит, стандарт не гарантирует этого..). Было бы так:

char a[sizeof(double) * CHAR_BIT == 64];

или

BOOST_STATIC_ASSERT(sizeof(double) * CHAR_BIT == 64);

Вы можете найти CHAR_BIT, определенный в <limits.h> или <climits>.

Ответ 2

В C99 вы можете просто проверить, установлен ли символ препроцессора __STDC_IEC_559__. Если это так, вам гарантируется, что double будет 8-байтовым значением, представленным в формате IEEE 754 (также известный как IEC 60559). См. Стандарт C99, приложение F. Я не уверен, что этот символ доступен на С++.

#ifndef __STDC_IEC_559__
#error "Requires IEEE 754 floating point!"
#endif

В качестве альтернативы вы можете проверить предопределенные константы __DBL_DIG__ (должно быть 15), __DBL_MANT_DIG__ (должно быть 53), __DBL_MAX_10_EXP__ (должно быть 308), __DBL_MAX_EXP__ (должно быть 1024), __DBL_MIN_10_EXP (должно быть -307) и __DBL_MIN_EXP__ (должно быть -1021). Они должны быть доступны во всех вариантах C и С++.

Ответ 3

Я не думаю, что вам следует сосредоточиться на "необработанном размере" вашего двойника (который обычно составляет 80 бит, а не 64 бит), а скорее его точности.

Благодаря numeric_limits:: digits10 это довольно просто.

Ответ 4

Проверьте std::numeric_limits< double >::is_iec559, если вам нужно знать, поддерживает ли ваша реализация на С++ стандартные удвоения. Это гарантирует не только то, что общее количество бит равно 64, но также размер и положение всех полей внутри двойника.

Ответ 6

Решение без boost - определить массив таким образом

char a[ 8 == sizeof(double) ];

Если double не 64 бит, тогда код будет выглядеть как

char a[0];

который является ошибкой времени компиляции. Просто поставьте соответствующий комментарий рядом с этой инструкцией.

Ответ 7

См. этот пост для аналогичной проблемы и утверждение времени неактивного компиляции, называемое CCASSERT.