Можно ли предположить, что Flash и PHP будут генерировать одинаковые числа с плавающей точкой? - PullRequest
2 голосов
/ 17 мая 2010

В многопользовательской игре, которую я разрабатываю, у нас есть несколько значений, которые являются числами с плавающей запятой. Внутренний (в PHP) и внешний (во Flash) иногда выполняют одни и те же вычисления для этих чисел, чтобы свести к минимуму обмен данными.

В настоящее время я проверяю, что обе стороны используют 64-битные двойные числа, но могу ли я с уверенностью предположить, что все вычисления будут одинаковыми?

Например, как насчет преобразования строки в число с плавающей запятой - стоит ли мне беспокоиться о том, что Flash может иметь другую реализацию, чем PHP? (Если это произойдет, наша игра выйдет из синхронизации - клиент будет думать, что он находится в одном состоянии, а сервер - в другом)

При некотором тестировании кажется таким же, но я просто не уверен. Может кто-нибудь уточнить это для меня?

Ответы [ 3 ]

2 голосов
/ 18 мая 2010

Вы не можете, потому что разные компиляторы могут создавать разный код даже для одного и того же выражения, но мы сравниваем разные интерпретаторы, скомпилированные богом, что знает.

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

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

0 голосов
/ 17 мая 2010

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

0 голосов
/ 17 мая 2010

Я бы работал в предположении, что это действительно тот же самый код с плавающей запятой. Кроме того, вы отправляете периодические контрольные точки (кадры с полными данными, рассчитанными вместо просто дельт), верно? Любые мелкие ошибки будут исправлены во время этих.

...