对于定点数 Class,我应该坚持使用 32 位还是 64 位类型?

Should I Stick to 32bit or 64bit Types for Fixed-Point Number Class?

我一直在用 C# 开发一款游戏,目前使用浮点数进行一些计算和算术运算。该游戏将具有网络功能和一个基本的回放系统,该系统可以随着时间的推移跟踪输入和基本玩家操作。我认为这些功能要求我让每个重要的核心机制都是确定性的。由于浮点数假定的不确定属性,我浏览了一些有关定点数的资源,以便为自己提供浮点数的替代方法。

我了解定点的许多核心概念,因为关于此事的各种文档非常丰富的在线资源。但是,我不确定是否应该使用 32 位类型 (int) 或 64 位类型 (long) 作为定点 class 的原始值。

我希望我的 class 具有以下基本功能:

我的假设是最好使用 long ,因为它会给我更多的小数精度,但我担心在此过程中可能会遇到潜在的障碍。例如,在针对 32 位或 运行ning 在 32 位 machines 上使用长提供问题吗?就潜在的硬件配置而言,int 最终是否比 long 更兼容?因为游戏很重性能,从float切换到long based fixed-point numbers会不会有很大的性能损失?

这似乎是一个愚蠢的问题,但我想我想知道我是否应该使用基于 cpu 架构的最低公分母的类型,我希望我的程序 运行 或者这些问题通常由编译器在编译期间处理吗? linux 或 mac osx 处理长计算的方式是否与 windows machine 不同?

您使用的类型与平台无关,因为在 C# 中,类型就是类型。换句话说,无论您在什么平台上,long 总是 64 位。这是C#的保证。

然而,真正的问题将是精度和比例。在进行定点数学运算时,您将不得不选择要使用的精度。这是一个简单的问题。扩展并不容易。如果您的数字将超过所选类型的最大值(考虑到这一点,请不要忘记包括小数),那么您就被淘汰了。

你研究过 decimal 类型吗?

decimal 仍然是浮点类型,但它是十进制浮点数,而不是 IEEE754 二进制浮点数,因此能够表示您输入的任何以 10 为底的数字,只要它符合 decimal 类型的比例和精度。

有关 decimal 类型的信息,请参阅这些链接:

然而,

decimal 会带来一些性能方面的考虑,如果性能至关重要,则可能不是游戏的最佳选择。对于简单的 2D 滚动条,你会很好,但它可能不适合除此以外的任何东西。

所有目标的结果将完全相同。整数数学就这么好,你真的可以相信它总是一样的。

不过,使用 long 会比较慢,尤其是针对 32 位机器以及 64 位机器时。虽然在 64 位机器上添加 int 和添加 long 需要相同的时间(如果它实际上是 64 位代码),但如果您没有两倍大的类型,则执行定点乘法需要一些额外的代码。 64位划分也有同样的问题。当然,在 32 位机器上,64 位操作是使用多个 32 位操作来模拟的,因此它们本身就稍微慢一些。

另一方面,有时您可能需要额外的精度。最后,您可能需要 32 位定点类型和 64 位定点类型,甚至需要多个具有不同定位基数点的定点类型。