所有 C++ 定点运算都是确定性的吗?
Are all C++ fixed-point operations deterministic?
我正在用 C++ 编写一个小型 RTS 引擎,并希望使用锁步同步。
由于浮点确定性是我什至无法实现的,我必须使用定点数学。
对无符号整数的典型操作的确定性如何(在不同的编译器和 CPU 上)?
我对除法特别感兴趣,因为这会导致四舍五入。
基本整数类型的大小因平台而异。您可以使用 uint32_t
和类似类型来避免此问题。
有符号整数溢出是未定义的行为,尽管溢出对于无符号整数类型是明确定义的(您执行算术模2^N
)。即便如此,你还是要小心,因为模运算通常不是你想要做的。
我相信标准从前是开放的,具体是如何四舍五入的(尽管我不确定 "positive / positive" 是否曾经开放过)。但我认为现在这是标准化的,即使不是,向 0 舍入也几乎是普遍的。
但是你可以使用numeric_limits
来检查。如果 this documentation 可信,则该标准确实保证四舍五入为零。
我正在用 C++ 编写一个小型 RTS 引擎,并希望使用锁步同步。
由于浮点确定性是我什至无法实现的,我必须使用定点数学。
对无符号整数的典型操作的确定性如何(在不同的编译器和 CPU 上)?
我对除法特别感兴趣,因为这会导致四舍五入。
基本整数类型的大小因平台而异。您可以使用 uint32_t
和类似类型来避免此问题。
有符号整数溢出是未定义的行为,尽管溢出对于无符号整数类型是明确定义的(您执行算术模2^N
)。即便如此,你还是要小心,因为模运算通常不是你想要做的。
我相信标准从前是开放的,具体是如何四舍五入的(尽管我不确定 "positive / positive" 是否曾经开放过)。但我认为现在这是标准化的,即使不是,向 0 舍入也几乎是普遍的。
但是你可以使用numeric_limits
来检查。如果 this documentation 可信,则该标准确实保证四舍五入为零。