Существуют ли современные платформы с плавающими форматами не IEEE C / C ++? - PullRequest
11 голосов
/ 27 апреля 2010

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

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

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

Приветствия,
Patrick

Ответы [ 3 ]

7 голосов
/ 27 апреля 2010

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

7 голосов
/ 28 апреля 2010

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

Для получения дополнительной информации об этом; читать http://gafferongames.com/networking-for-game-programmers/floating-point-determinism/

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

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

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

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

2 голосов
/ 27 апреля 2010

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

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

...