【发布时间】:2016-01-15 09:20:35
【问题描述】:
我们有一款游戏需要确定性,因为它是其多人模式的一部分。我们也使用Lua,内部使用sprintf(格式为%.14g)。
当它打印像 0.00001 这样的数字时会出现问题。在某些情况下,它会打印出1e-05,而在其他一些情况下,它会打印出1e-005(额外的零)。
例如,使用 Visual Studio 2015 编译时,它会打印 1e-005,而使用 Visual Studio 2013 编译时,它会打印 1e-05。我尝试了不同的语言环境设置,但似乎没有任何效果。
问题是:实现确定性结果的最佳解决方案是什么? 我真的不在乎科学记数法是标准化的还是被淘汰的。
我想到的解决方案:
- 当我使用
%f表示法时,它不会忽略不重要的零,因此使用%.14f会导致不切实际的长数字。 - 使用自定义
sprintf方法(从一些标准库复制粘贴) - 使用了一些我没想到的特殊格式(我仅以此作为参考:http://www.cplusplus.com/reference/cstdio/printf/)
【问题讨论】:
-
我过去曾通过在缓冲区中使用
sprintf然后对其进行一些字符串处理来解决类似的问题。非常老套,但当时它对我有用。 -
实现确定性结果的最佳解决方案是使用整数。但是你也可以使用 hexafloat
%a格式。 -
我很关心它,因为确定性需要一直完整。任何差异都可能导致更大的差异等。我们还有用于尽快检测差异的控制机制,因此即使更改不会真正影响游戏,它也会提醒这些机制。 (类似于删除编译器警告)。
-
所以你不希望它在某些机器上有一个额外的零,但它是供人类阅读的?修复似乎有点无意义。
-
我希望它是 a) 人类可读 b) 在所有机器上都一样。
标签: c++ lua printf string-formatting