不,这不是另一个 “为什么(1/3.0) * 3! = 1”问题。
我最近读了很多关于浮点数的文章,特别是关于不同架构或优化设置上的 同样的计算可能得出不同的结果。
这对于存储重放的视频游戏来说是个问题,或者是 点对点网络(相对于服务器-客户端) ,它依赖于所有客户端在每次运行程序时产生完全相同的结果——一个浮点计算中的一个小差异可能会导致在不同的机器上(甚至是 在同一台机器上!)出现截然不同的游戏状态
这种情况甚至发生在“遵循”IEEE-754的处理器之间,主要是因为一些处理器(即 x86)使用 双扩展精度双扩展精度。也就是说,他们使用80位寄存器做所有的计算,然后截断到64位或32位,导致不同的舍入结果比机器使用64位或32位的计算。
我在网上看到过几个解决这个问题的方案,但都是针对 C + + 的,而不是 C # :
_controlfp_s
(Windows)、 _FPU_SETCW
(Linux?)或 fpsetprec
(BSD)禁用双扩展精度模式(以便所有 double
计算都使用 IEEE-75464位)。float
和 double
。decimal
可以满足这个目的,但是速度要慢得多,而且 System.Math
库函数都不支持它。那么,如果我只想支持 Windows (而不是 Mono)呢?
如果是的话,有没有办法强制我的程序以正常的双精度运行?
如果没有,有没有图书馆可以帮助保持浮点计算的一致性?