Обеспечение удваивания С++ - 64 бита
В моей программе на С++ мне нужно вывести 64-битный float из внешней байтовой последовательности. Есть ли способ обеспечить во время компиляции удвоение 64 бит? Есть ли другой тип, который я должен использовать для хранения данных?
Изменить: если вы читаете это и фактически ищете способ обеспечить хранение в формате IEEE 754, посмотрите на ответ Адама Розенфилда ниже.
Ответы
Ответ 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, но также размер и положение всех полей внутри двойника.
Ответ 5
Вы можете использовать Boost static assertions для этого. Посмотрите на Пример использования в пространстве имен.
Ответ 6
Решение без boost - определить массив таким образом
char a[ 8 == sizeof(double) ];
Если double не 64 бит, тогда код будет выглядеть как
char a[0];
который является ошибкой времени компиляции. Просто поставьте соответствующий комментарий рядом с этой инструкцией.
Ответ 7
См. этот пост для аналогичной проблемы и утверждение времени неактивного компиляции, называемое CCASSERT.