2015-05-05 6 views
9

Я пишу небольшой движок RTS на C++ и хочу использовать синхронизацию с синхронизацией.Все операции C++ с фиксированной точкой детерминированы?

Поскольку детерминизм с плавающей запятой - это то, чего я не могу даже надеяться достичь, я должен использовать математику с фиксированной точкой.

Как детерминистически (по сравнению с другими компиляторами и процессором) являются типичными операциями с неподписанными целями?

Меня особенно интересует разделение, поскольку это повлечет за собой округление.

+4

100% детерминированный, или, по крайней мере, они должны быть, если они, вероятно, не могут быть разбиты на центральный процессор – Raxvan

+0

@ Раксван прав. Это то, что банки используют за деньги. Как правило, они масштабируются на 1000, так что у них есть 10th цент за округление вещей вверх/вниз. Помните, что операции будут усекаться в конце int. –

+0

Не существуют игры rts с использованием математики с плавающей запятой для этой цели? – Karl

ответ

5

Размер основных целых типов зависит от разных платформ. Вы можете избежать этой проблемы, используя uint32_t и аналогичные типы.

Подтвержденное целочисленное переполнение - неопределенное поведение, хотя переполнение корректно определено для неподписанных интегральных типов (вы выполняете арифметический модул 2^N). И все же вы должны следить за этим, потому что модульная арифметика обычно не то, что вы пытались сделать.

Я считаю, что стандарт раз в то время оставался открытым точно, как разделение округлено (хотя я не уверен, что «положительный/положительный» когда-либо оставался открытым). Но я думаю, что это стандартизировано сейчас, и даже если нет, округление до нуля почти универсально.

Но вы можете использовать numeric_limits для проверки. Если полагать this documentation, стандарт гарантирует округление до нуля.

+0

в C++ 03, было открыто округление округления. В C++ 11, теперь он стандартизован, и я _think_ настраиваем, но я точно не помню. –

Смежные вопросы