Есть ли какие-либо современные платформы с не-IEEE плавающие форматы C/C++?

Я пишу видеоигру, Humm и Strumm, который требует сетевого компонента в его игровом механизме. Я могу иметь дело с различиями в порядке байтов легко, но я врезался в стену в попытке иметь дело с возможным float форматы памяти. Я знаю, что современные компьютеры имеют весь стандартный целочисленный формат, но я услышал, что они не могут все использовать стандарт IEEE для целых чисел с плавающей точкой. Действительно ли это верно?

В то время как, конечно, я мог просто произвести его как символьную строку в каждый пакет, я должен буду все еще преобразовать в "известный формат" каждого клиента, независимо от платформы. Стандарт printf() и atod() было бы несоответствующим.

Отметьте, потому что эта игра является Бесплатной программой / программой Программного обеспечения с открытым исходным кодом, которая будет работать на GNU/Linux, *BSD и Microsoft Windows, я не могу использовать собственные решения, ни любые одноплатформенные решения.

Удачи,
Patrick

14
задан Patrick Niedzielski 27 April 2010 в 19:27
поделиться

3 ответа

Я думаю, что можно с уверенностью предположить, что каждая платформа имеет реализацию спецификации IEE-754, на которую вы можете положиться, однако, даже если все они реализуют одна и та же спецификация, нет гарантии, что каждая платформа имеет одну и ту же реализацию, имеет одинаковые установленные флаги управления FP, выполняет одинаковые оптимизации или реализует одни и те же нестандартные расширения. Это делает детерминизм с плавающей запятой очень сложным для контроля и несколько ненадежным для использования для такого рода вещей (когда вы будете передавать значения FP по сети).

Для получения дополнительной информации об этом; прочтите http: // gafferongames.com / network-for-game-programmers / с плавающей запятой-детерминизм /

Еще одна проблема, которую необходимо решить, - это работа с клиентами, у которых нет модуля с плавающей запятой; в большинстве случаев это будут процессоры начального уровня, консоли или встроенные устройства. Обязательно примите это во внимание, если хотите настроить таргетинг на них. Эмуляция FP может быть выполнена, но на этих устройствах она, как правило, очень медленная, поэтому вам придется научиться выполнять вычисления с фиксированной точкой. Однако имейте в виду, что написание сложных классов для абстрактных вычислений с плавающей запятой и с фиксированной запятой в один и тот же код звучит как план; но на большинстве устройств нет. Это не позволяет добиться максимальной точности и производительности при работе со значениями с фиксированной точкой.

Еще одна проблема заключается в обработке порядка байтов значений с плавающей запятой, потому что вы не можете просто поменять местами байты и снова сложить их в регистре с плавающей запятой (байты могут иметь другое значение, см. http: // www. dmh2000.com/cpp/dswap.shtml по этому поводу).

Я бы посоветовал преобразовать числа с плавающей запятой в промежуточные значения с фиксированной запятой, при необходимости выполнить коррекцию порядка байтов и передать их. Также не думайте, что два вычисления с плавающей запятой на разных машинах дадут одинаковые результаты; они этого не делают. Однако реализации с плавающей запятой, отличные от IEEE-754, встречаются редко. Например, графические процессоры, как правило, используют фиксированную точку, но в наши дни более вероятно, что они будут иметь подмножество IEEE-754, потому что они не хотят иметь дело с исключениями с делением на ноль, но у них будут расширения для половинных поплавков, которые подходят 16 бит.

Также имейте в виду, что существуют библиотеки, которые уже решили эту проблему (отправка низкоуровневых форматов данных в игровом контексте) за вас. Одной из таких библиотек является RakNet, в частности, класс BitStream, предназначенный для надежной отправки таких данных на разные платформы при минимальных накладных расходах; например, RakNet испытывает определенные трудности, чтобы не тратить полосу пропускания на отправку строк или векторов.

7
ответ дан 1 December 2019 в 13:58
поделиться

Некоторые встроенные процессоры вообще не содержат аппаратного обеспечения с плавающей запятой. Что касается настольных компьютеров, я не вижу причин для слишком большого беспокойства, кроме деталей, которые действительно раздражают специалистов ( sqrt неправильно округлено на Alpha, такого рода вещи. Различия, которые их раздражают, заключаются в выполнение операций, во всяком случае, не формата).

Одно изменение между платформами связано с обработкой денормальных значений . Я задал вопрос о них некоторое время назад . Даже это оказалось не так плохо, как я ожидал.

2
ответ дан 1 December 2019 в 13:58
поделиться

Если вы правильно абстрагируете свой сетевой интерфейс, у вас могут быть функции / объекты, которые сериализуют и десериализуют типы данных с плавающей запятой. В каждой системе, которую я могу придумать, это стандарт IEEE, поэтому вы просто должны передать данные без изменений (компилятор, вероятно, даже оптимизирует его, чтобы вы не потеряли производительность). Если вы столкнетесь с какой-либо системой с другим форматом, вы можете условно скомпилировать некоторый код в этих функциях, чтобы выполнить битовые взломы для преобразования из стандарта IEEE в собственный формат. Вам нужно будет изменить его только в одном месте. Однако вам, вероятно, никогда не понадобится это делать, если только вы не перейдете к консолям / карманным компьютерам и т. Д.

7
ответ дан 1 December 2019 в 13:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: