Бинарная разметка с плавающей точкой между компиляторами - PullRequest
3 голосов
/ 31 октября 2011

Я очищаю часть нашего сетевого кода и заменяю различные целочисленные типы (int, unsigned short, ...) более подробными определениями типа explcit, такими как int32_t и uint16_t.double и float между разными компиляторами.Мы отправляем структуры, подобные следующим:

struct foo
{
   uint32_t id;
   double dbl;
};

...

// copy_packed() copies packed bytes of integral type and adheres 
// to network byte-ordering
copy_packed(int32_t data, char* buffer, char* end);
copy_packed(uint32_t data, char* buffer, char* end);
copy_packed(uint16_t data, char* buffer, char* end);

...
// overload for structure types calls overloads for its members
void copy_packed(foo &data, char* buffer, char* end)
{
    copy_packed(data.id, buffer); 
    copy_packed(data.id, buffer); 
};

До сих пор используются только программы, скомпилированные с VC ++, но запланировано использование протокола на GCC.

Вопрос теперь: можетdouble amd float безопасно отправлять по проводам, даже если они интерпретируются различными компиляторами?Вопрос - насколько я понимаю - сводится к тому, соответствуют ли GCC и VC ++ IEEE754.Или, может быть, предоставить функции для преобразования в соответствующую упаковку?

Есть какие-нибудь советы по этому поводу?

Ответы [ 3 ]

4 голосов
/ 31 октября 2011

Не очень.IEEE не определяет порядок байтов, и не все системы являются IEEE.Реальный вопрос в том, насколько портативным ты должен быть.IEEE в значительной степени универсален для современных платформ Unix, а также для Windows;если ваша переносимость ограничена этим, вы обычно можете набрать pun float в uint32_t и double в uint64_t и обрабатывать ввод и вывод таким образом.Если вам нужно принять во внимание мэйнфреймы (и, возможно, встроенные процессоры - я менее знаком с ними), у вас будет гораздо больше работы;плавающая точка на основных мэйнфреймах даже не является базовой 2.

4 голосов
/ 31 октября 2011

Вы можете спросить компилятор: std::numeric_limits<T>::is_iec559 скажет вам, является ли тип T типом IEC559 (IEEE754).

2 голосов
/ 31 октября 2011

Это одна из лучших статей, которые я когда-либо видел по арифметике с плавающей точкой. Переход к текущим реализациям IEEE 754

Текущие реализации арифметики IEEE 754 можно разделить на две группы, различающиеся степенью, в которой они поддерживают различные форматы с плавающей запятой в аппаратном обеспечении.Расширенные системы, примером которых является семейство процессоров Intel x86, обеспечивают полную поддержку расширенного формата двойной точности, но только частичную поддержку одинарной и двойной точности: они предоставляют инструкции для загрузки или хранения данных с одинарной и двойной точностью, преобразовывая их в- на лету в или из расширенного двойного формата, и они предоставляют специальные режимы (не по умолчанию), в которых результаты арифметических операций округляются до одинарной или двойной точности, даже если они хранятся в регистрах в расширенном двойном формате.(Процессоры Motorola серии 68000 округляют результаты до точности и диапазона одинарного или двойного форматов в этих режимах. Intel x86 и совместимые процессоры округляют результаты до точности одинарного или двойного форматов, но сохраняют тот же диапазон, что и расширенный двойной формат.) Одиночные / двойные системы, включая большинство процессоров RISC, обеспечивают полную поддержку форматов одинарной и двойной точности, но не поддерживают совместимый с IEEE расширенный формат двойной точности.(Архитектура IBM POWER обеспечивает только частичную поддержку одинарной точности, но для целей этого раздела мы классифицируем ее как одинарную / двойную систему.)

...