Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对于固定点数类,我应该坚持使用32位还是64位类型?_C#_Int_32bit 64bit_Long Integer_Fixed Point - Fatal编程技术网

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

C# 对于固定点数类,我应该坚持使用32位还是64位类型?,c#,int,32bit-64bit,long-integer,fixed-point,C#,Int,32bit 64bit,Long Integer,Fixed Point,我一直在用C#开发一个游戏,目前它使用浮点进行一些计算和算术。这个游戏将具有网络功能和一个基本的重播系统,随着时间的推移,它可以跟踪输入和玩家的基本动作。我认为这些特性要求我让每一个重要的核心机制都是确定性的。由于浮点数被认为是不确定的属性,为了给自己提供一种替代浮点数的方法,我已经阅读了一些关于固定点数的资料 我了解许多固定点的核心概念,这是因为有很多关于这个问题的在线资源都有很好的文档记录。但是,我不确定是否应该使用32位类型(int)或64位类型(long)作为定点类的原始值 我想为我的班

我一直在用C#开发一个游戏,目前它使用浮点进行一些计算和算术。这个游戏将具有网络功能和一个基本的重播系统,随着时间的推移,它可以跟踪输入和玩家的基本动作。我认为这些特性要求我让每一个重要的核心机制都是确定性的。由于浮点数被认为是不确定的属性,为了给自己提供一种替代浮点数的方法,我已经阅读了一些关于固定点数的资料

我了解许多固定点的核心概念,这是因为有很多关于这个问题的在线资源都有很好的文档记录。但是,我不确定是否应该使用32位类型(int)或64位类型(long)作为定点类的原始值

我想为我的班级提供以下基本特征:

  • 传递float、double或int并将其转换为定点值
  • 针对定点、整数、浮点和双精度类型的值进行加法、减法、除法和乘法
我的假设是,最好使用long,因为它会给我更多的小数精度,但我担心可能会遇到潜在的障碍。例如,当以32位为目标或在32位计算机上运行时,使用长字符串是否会带来问题?当涉及到潜在的硬件配置时,INT最终是否比long更兼容?因为游戏的性能很高,所以当从浮点型切换到长基定点数字时,会有很大的性能损失吗


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

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

然而,真正的问题将是精度和规模。。在进行定点计算时,必须选择要使用的精度。这是一个容易的问题。不容易的是缩放。如果你的数字超过了你选择的类型的最大值(别忘了考虑小数),那么你就出局了

您查看过十进制类型吗

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

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


decimal
有一些性能方面的考虑,但是,如果性能非常关键,它可能不是游戏的最佳选择。对于一个简单的2D滚动条,您可以使用它,但除此之外,它可能不适合任何其他用途。

所有目标的结果都完全相同。整数数学就是这样,你可以相信它在任何时候都是一样的

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


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

C中的Int始终是32位的,而C中的long始终是64位的。这是该语言和CLR的一个特点。处理器可以是32位或64位,这只是衡量它一次可以处理多少数据的指标。这与语言中的数据类型无关。我听说十进制类型可能很慢,这对于游戏操作来说并不理想。From:它确实有一些性能方面的考虑,但是定制的定点类也有很多自己的考虑。根据应用程序的复杂性,手动实现已解决的问题可能不值得费心。