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