我听说不同CPU的浮点数/双打有很多问题。
如果我想制作一个使用花车进行游戏的游戏,我怎么能确定每台机器上的浮点计算完全相同,以便我的模拟在每台机器上看起来完全相同?
我还担心写/读文件或将浮点值发送/接收到不同的计算机。必须进行哪些转换,如果有的话?
我需要100%确定我的浮点值计算完全相同,因为即使计算中的细微差别也会导致完全不同的未来。这甚至可能吗?
答案 0 :(得分:2)
标准C ++没有规定除范围约束之外的浮点类型的任何细节,并且可能某些数学函数(如正弦和指数)必须在一定精度范围内正确。
除此之外,在这种普遍性水平上,你真的没有别的东西可以依赖!
也就是说,您很可能实际上不需要在每个平台上进行二进制相同的计算,并且float
或double
类型的精度和准确性保证实际上足以满足模拟目的。
请注意,当您修改子表达式的评估顺序时,甚至无法在自己的程序中生成代数表达式的可靠结果,因此要求您所需的可重复性类型可能有点不切实际。如果你需要真正的浮点精度和精度保证,你可能会更好地使用具有正确舍入的任意精度库,例如MPFR - 但这对于游戏来说似乎是不现实的。
序列化浮动是一个完全不同的故事,你必须对目标平台使用的表示有所了解。如果所有平台实际上都使用32位或64位大小的IEEE 754浮点数,那么您可能只是直接交换二进制表示(模数字节式)。如果您有其他平台,则必须考虑自己的序列化方案。
答案 1 :(得分:1)