我需要确保玩游戏的玩家的演示 - 保存为按键 - 在所有计算机上100%可重现。浮点数不能保证100%安全(我不能只使用整数,因为游戏的世界并不是完全正交的等等)因此不准确会在不同的机器上累加,导致播放到被打破 - 或者更确切地说:他们可以加起来并导致它破裂。
我非常确定,对于几个小数位,系统与系统之间的浮点数相同,所以我决定使用浮点数但是每个一个...... 多少小数位? ...在保存它们以供以后在程序中使用之前。
为了更加确定,我想我总是可以创建一个程序来检查每个可能的浮动产生计算与标准结果的列表" 查看机器是否适合该任务。
提前致谢!
答案 0 :(得分:0)
零。
如果两台机器上的结果之间存在任何偏差,则根据所涉及的数学和算法,它可能会在进一步计算中任意增大。
通常,简单算术运算(加法,减法,乘法,除法,甚至平方根)的偏差将从一个ULP的水平开始或低于一个ULP的水平。 (ULP是最小精度的单位,是值中表示的最低位。)这些偏差可能发生,因为不同的编译器可能使用不同的精度来评估浮点表达式。例如,即使您使用float
个操作数,编译器在计算时也可能使用double
精度。使用float
精度的系统将从使用double
精度的系统获得不同的答案。
在更复杂的操作中,例如调用pow
,sin
和log
等数学库例程,可能会有更大的差异。基本上没有商业数学库使用正确舍入的结果来实现这些例程。 (如果生成的结果是正确舍入,就好像使用指定的舍入规则将精确的数学结果四舍五入到最接近的可表示结果,例如始终向上[朝向∞]或总是朝向最近的与低位相关联。)数学库例程返回几个ULP关闭的结果(有时在质量差的实现中更多),并且不同供应商的库将返回不同的结果,这并不罕见。
为了在不同平台上重现相同的结果,您需要密切控制浮点运算。很少有编译器为此提供良好的支持。 IEEE 754算法的硬件支持很普遍,因此您可以通过使用汇编语言并避免各种陷阱来获得可重现的结果。 (一个陷阱是在多个线程或其他非确定性执行上传播计算。另一个是处理器,默认情况下将次正常值刷新为零,而不是返回正确的IEEE 754结果。)
你写道“我决定使用浮点数,但每一个都是圆形的......”这不是一个不常见的概念,但它有缺陷。这样做的一个问题是它放大了圆点附近的误差。例如,假设您正在四舍五入到最接近的1的倍数(非常大,但这只是为了说明)。因此2.49将四舍五入为2,而2.51将四舍五入为3.如果在一个平台上结果为2.499而在另一个平台上为2.501,会发生什么?然后将结果四舍五入为2和3.现在,您已经改变了两个平台之间的微小差异,并使它产生了很大的差异。