所有 C++ 定点运算都是确定性的吗?

Are all C++ fixed-point operations deterministic?

我正在用 C++ 编写一个小型 RTS 引擎,并希望使用锁步同步。

由于浮点确定性是我什至无法实现的,我必须使用定点数学。

对无符号整数的典型操作的确定性如何(在不同的编译器和 CPU 上)?

我对除法特别感兴趣,因为这会导致四舍五入。

基本整数类型的大小因平台而异。您可以使用 uint32_t 和类似类型来避免此问题。

有符号整数溢出是未定义的行为,尽管溢出对于无符号整数类型是明确定义的(您执行算术模2^N)。即便如此,你还是要小心,因为模运算通常不是你想要做的。

我相信标准从前是开放的,具体是如何四舍五入的(尽管我不确定 "positive / positive" 是否曾经开放过)。但我认为现在这是标准化的,即使不是,向 0 舍入也几乎是普遍的。

但是你可以使用numeric_limits来检查。如果 this documentation 可信,则该标准确实保证四舍五入为零。