Обеспечение 64-битной двойственности C++.
-
09-09-2019 - |
Вопрос
В моей программе на C++ мне нужно извлечь 64-битное число с плавающей запятой из внешней последовательности байтов.Есть ли какой-нибудь способ гарантировать во время компиляции, что двойные значения являются 64-битными?Есть ли какой-то другой тип, который я должен использовать для хранения данных?
Редактировать:Если вы читаете это и на самом деле Если вы ищете способ обеспечить хранение в формате IEEE 754, ознакомьтесь с ответом Адама Розенфилда ниже.
Решение
Улучшение по сравнению с другими ответами (которые предполагают, что символ имеет 8 бит, стандарт этого не гарантирует...).Было бы так:
char a[sizeof(double) * CHAR_BIT == 64];
или
BOOST_STATIC_ASSERT(sizeof(double) * CHAR_BIT == 64);
Вы можете найти CHAR_BIT, определенный в <limits.h>
или <climits>
.
Другие советы
В C99 вы можете просто проверить, есть ли символ препроцессора __STDC_IEC_559__
определено.Если да, то вы гарантированно получите double
будет 8-байтовым значением, представленным в формате IEEE 754 (также известном как IEC 60559).См. стандарт C99, Приложение F.Однако я не уверен, доступен ли этот символ в C++.
#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 и C++.
Проверять std::numeric_limits< double >::is_iec559
если вам нужно знать, поддерживает ли ваша реализация C++ стандартные двойные значения.Это гарантирует не только то, что общее количество бит равно 64, но также размер и положение всех полей внутри дабла.
Я не думаю, что вам следует сосредотачиваться не на «необработанном размере» вашего двойника (который обычно составляет 80 бит, а не 64 бита), а скорее на его точности.
Благодаря numeric_limits::digits10 это довольно просто.
Вы можете использовать Усиление статических утверждений сделать это.Посмотрите на Использовать в области пространства имен пример.
Решение без повышения состоит в том, чтобы определить массив следующим образом.
char a[ 8 == sizeof(double) ];
Если двойное значение не 64 бита, код будет выглядеть так:
char a[0];
что является ошибкой времени компиляции.Просто поставьте соответствующий комментарий возле этой инструкции.
Видеть эта почта для аналогичной проблемы и утверждения времени компиляции без повышения скорости, называемого CCASSERT.