我应该坚持32位或64位类型的定点数类?

时间:2015-01-17 08:04:58

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

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

我理解定点的许多核心概念,因为有关这个问题的各种非常好的在线资源。但是,我不确定是否应该使用32位类型(int)或64位类型(长)作为定点类的原始值。

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

  • 传递float,double或int并将其转换为定点值。
  • 加法,减法,除法,乘以定点,整数,浮点数和双精度值。

我的假设是最好使用很长时间,因为它会给我更多小数精度,但我担心可能会出现的潜在障碍。例如,在定位32位或在32位机器上运行时会使用很长的问题吗?在涉及潜在的硬件配置时,ints最终是否兼容性更强?因为游戏性能很重,从浮点数转换为基于长定点的数字时会有很大的性能损失吗?

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

2 个答案:

答案 0 :(得分:4)

您使用的类型与平台无关,因为类型类型是C#中的类型。换句话说,无论你使用什么平台,长总是64位。它是C#的保证。

然而,真正的问题是精确度和规模。在进行定点数学运算时,你必须选择你想要使用的精度。这是一个简单的问题。缩放是不容易的。如果您的数字超过所选类型的最大值(请勿忘记在此考虑中包含小数),那么您就会被打破。

您是否查看了decimal类型?

decimal仍然是一个浮点类型,但它是浮点十进制,而不是IEEE754二进制浮点数,因此能够表示你抛出的任何基数为10的数字,所以因为它符合decimal类型的比例和精度。

有关decimal类型的信息,请参阅以下链接:

然而,

decimal会考虑一些性能因素,如果性能至关重要,可能不是游戏的最佳选择。对于一个简单的2D滚动条,你可以没问题,但除此之外,它可能并不理想。

答案 1 :(得分:2)

所有目标的结果都完全相同。整数数学很好,你可以真正依赖它同时也是一样。

使用long会慢一些,特别是在定位32位机器时,也会在64位机器上。虽然在64位计算机上添加整数和添加长整数需要相同的时间(如果它实际上是64位代码),但如果没有两倍大的类型,则执行修复点乘法需要一些额外的代码。 64位分区有同样的问题。当然在32位机器上,使用多个32位操作模拟64位操作,因此它们本身就会稍微慢一些。

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