Вопрос

В моей программе на 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top