如何保证 .NET 应用程序(例如 C#)中的浮点计算总是产生相同的位精确结果?尤其是在使用不同版本的 .NET 并在不同平台上运行时(x86 与 x86_64)。浮点运算的不准确性无关紧要。
在 Java 中,我会使用 strictfp。在 C/C++ 和其他低级语言中,这个问题基本上是通过访问 FPU / SSE 控制寄存器来解决的,但这在 .NET 中可能是不可能的。
即使控制了 FPU 控制寄存器,.NET 的 JIT 也会在不同的平台上生成不同的代码。在这种情况下,像 HotSpot 这样的东西会更糟......
为什么我需要它?我正在考虑编写一个实时策略 (RTS) 游戏,它在很大程度上依赖于快速浮点数学以及锁步模拟。本质上,我只会通过网络传输用户输入。这也适用于通过存储用户输入来实现回放的其他游戏。
不是一个选项是:
- 小数(太慢)
- 定点值(使用 sqrt、sin、cos、tan、atan 时太慢且太麻烦……)
- 像 FPS 一样通过网络更新状态:发送数百或数千个单位的位置信息不是一种选择
有任何想法吗?