Я пишу небольшой движок RTS на C ++ и хочу использовать синхронизацию с блокировкой.
Поскольку детерминизм с плавающей запятой - это то, чего я даже не могу надеяться достичь, я должен использовать математику с фиксированной запятой.
Насколько детерминированно (в разных компиляторах и процессорах) определены типичные операции с целыми числами без знака?
Меня особенно интересует деление, так как оно повлечет за собой округление.
a + (b + c) == (a + b) + c
не обязательно верно, но некоторые компиляторы делают вид, что могут это делать (ICC по умолчанию, GCC, если вы используете небезопасную математику, которая, очевидно, небезопасна) - person harold   schedule 05.05.2015/fp:fast
, что может привести к различиям в оптимизации. Использование/arch:SSE2
для x86 (что также рекомендуется сегодня и используется по умолчанию для VS 2012+) сделает ваш 32-битный код намного ближе к генерации собственного кода x64 (который никогда не использует x87). Всегда лучше использовать эпсилон-сравнение для чисел с плавающей запятой. - person Chuck Walbourn   schedule 27.05.2015