关于整数,已经有了一个很好的答案,但我觉得不应消除浮点数。在他的回答中,Byte56选择了去做冥王星最大轨道的选项,可能是从这张excel表中选出的,所以我会坚持下去。
这使太阳系的边界位于:
7,376,000,000公里= 7.376x10 ^ 9厘米= 7.376x10 ^ 14厘米≈7.4x10 ^ 14厘米
在双精度浮点数优惠15个显著小数最大精度。因此,您很幸运:如果您的原点位于太阳的中心,并且在冥王星周围使用一个位置,则可以表示所有厘米,例如在C ++中:
printf("%.0Lf\n", 7.4e14);
printf("%.0Lf\n", 7.4e14 + 1.0);
printf("%.0Lf\n", 7.4e14 + 2.0);
Output:
-------
740000000000000
740000000000001
740000000000002
因此,如果您可以将游戏限制在冥王星的轨道上,那么恭喜您!您已经具有足够的精度,可以使用双精度来表示它。
请注意,这足以在模拟中表示它,但不要期望能够毫不费力地渲染它。您必须将其转换为32位浮点数,或者更改原点,以便在接近的对象上获得足够的精度,并且可能必须依靠一些Z缓冲区和相机平截头体欺骗才能使所有这些内容正确渲染。
现在,如果您希望宇航员访问更大的奥尔特云中的一些彗星,那就结束了。在10 ^ 16厘米左右,您开始失去精度:
printf("%.0Lf\n", 1.0e16);
printf("%.0Lf\n", 1.0e16 + 1.0);
printf("%.0Lf\n", 1.0e16 + 2.0);
Output:
-------
10000000000000000
10000000000000000 <-- oops
10000000000000002
当然,情况还会进一步恶化。
因此,在这种情况下,您可能想尝试一些更高级的解决方案。我建议您看一下Peter Freeze在Game Programming Gems 4中的文章:“ 2.3解决大世界坐标系中的精度问题”。IIRC,他建议一个可能适合您需求的系统,它实际上是多种不同的坐标空间。
那只是一些提示,您可能必须使用自己的一些配方才能运行此程序。已经实施了此类工作的人可能会为您提供更多帮助。例如,为什么不向Kerbal Space Program背后的家伙发送电子邮件呢?
祝您比赛顺利!