【发布时间】:2015-05-05 14:48:42
【问题描述】:
我正在用 C++ 编写一个小型 RTS 引擎,并想使用锁步同步。
由于浮点确定性是我什至无法实现的,所以我必须使用定点数学。
在无符号整数上定义的典型操作的确定性如何(通过不同的编译器和 CPU)?
我对除法特别感兴趣,因为它会导致四舍五入。
【问题讨论】:
-
100% 确定性,或者至少应该是,如果不是,CPU 可能会损坏
-
@zoran404 当然,双精度可以存储它,但是如果您对其进行数学运算,编译器不一定能确保 100% 可移植的结果。例如,它可能使用 x87 的 80 位扩展精度,因此会给出不同的结果。或者它可能会进行非法的操作重新关联,
a + (b + c) == (a + b) + c不一定是真的,但一些编译器会假装他们可以做到这一点(ICC 默认情况下,如果您使用显然不安全的不安全数学,则为 GCC) -
这个问题没有意义,如果使用IEEE浮点,结果也是确定性的。错误总是一样的。你到底在担心什么?那个浮点数不够精确?另外我不明白锁步与浮点与定点有什么关系......
-
更不用说,如果您正在开发游戏,则会出现一些有用的行为,例如 DirectX 会默默地改变您的 CPU 舍入模式。
标签: c++ fixed-point