Что я должен знать при использовании поплавков / двойников между разными машинами? - PullRequest
4 голосов
/ 29 июля 2011

Я слышал, что есть много проблем с плавающими / двойными на разных процессорах.

Если я хочу создать игру, которая использует поплавки для всего, как я могу быть уверен, что расчеты поплавков одинаковы на каждой машине, чтобы моё моделирование выглядело одинаково на каждой машине?

Я также обеспокоен записью / чтением файлов или отправкой / получением значений с плавающей запятой на разные компьютеры. Какие преобразования должны быть сделаны, если таковые имеются?

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

Ответы [ 2 ]

2 голосов
/ 29 июля 2011

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

Кроме этого, на этом уровне общности, на самом деле больше нет ничего, на что вы можете положиться!

Тем не менее, вполне возможно, что вам на самом деле не потребуются идентичные в двоичном виде вычисления на каждой платформе, и что гарантии точности и точности типов float или double фактически будут достаточны для целей моделирования.

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

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

1 голос
/ 29 июля 2011

Что должен знать каждый программист: http://docs.sun.com/source/806-3568/ncg_goldberg.html

...