【问题标题】:Should I Stick to 32bit or 64bit Types for Fixed-Point Number Class?对于定点数类,我应该坚持使用 32 位还是 64 位类型?
【发布时间】:2015-01-17 08:04:57
【问题描述】:

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

我了解定点的许多核心概念,因为有各种关于此问题的详细记录的在线资源。但是,我不确定是否应该将 32 位类型 (int) 或 64 位类型 (long) 用于定点类的原始值。

我想为我的班级提供以下基本功能:

  • 传递浮点、双精度或整数并将其转换为定点值。
  • 针对定点、int、float 和 double 类型的值进行加、减、除、乘。

我的假设是最好使用 long ,因为它可以让我获得更高的小数精度,但我担心可能会遇到的潜在障碍。例如,在针对 32 位或在 32 位机器上运行时使用 long 提供问题?当涉及到潜在的硬件配置时,int 最终是否比 long 更兼容?因为游戏的性能很重,从浮点数切换到基于长整数的定点数时会不会有很大的性能损失?

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

【问题讨论】:

  • C# 中的 Int 始终为 32 位,C# 中的 long 始终为 64 位。这是语言和 CLR 的一个特性。处理器可以是 32 位或 64 位,这只是衡量它一次可以处理多少数据的指标。它与语言中的数据类型无关。

标签: c# int 32bit-64bit long-integer fixed-point


【解决方案1】:

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

但是,真正的问题是精度和规模。在进行定点数学运算时,您必须选择要使用的精度。这是一个简单的问题。不容易的是缩放。如果您的数字超过了您选择的类型的最大值(不要忘记在此考虑中包括小数),那么您就被淘汰了。

您是否研究过decimal 类型?

decimal 仍然是浮点类型,但它是十进制浮点数,而不是 IEEE754 二进制浮点数,因此能够表示任何以 10 为基数的数字,只要它适合decimal 类型的规模和精度。

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

decimal 带有一些性能注意事项,但是,如果性能至关重要,它可能不是游戏的最佳选择。对于一个简单的 2D 滚动条,你会很好,但它可能不适合其他任何东西。

【讨论】:

  • 我听说十进制类型可能很慢,这对于游戏操作来说并不完全理想。来自:gamedev.stackexchange.com/questions/14776/…
  • 它确实有一些性能方面的考虑,但自定义定点类也会有很多自己的。根据应用程序的复杂性,可能不值得为已解决问题的手动实现而烦恼。
【解决方案2】:

所有目标的结果将完全相同。整数数学就是这样很好,你真的可以依赖它在同一时间是一样的。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-08
    • 2011-06-29
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 2016-02-06
    • 2011-07-06
    • 2015-04-16
    相关资源
    最近更新 更多