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

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

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

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

我希望我的类(class)具备以下基本功能:

  • 传递 float、double 或 int 并将其转换为定点值。
  • 对定点、int、float 和 double 类型的值进行加法、减法、除法和乘法。

我的假设是最好使用 long,因为它会给我更多的小数精度,但我担心可能会遇到潜在的障碍。例如,在以 32 位为目标或在 32 位机器上运行时,使用 long 会带来问题吗?就潜在的硬件配置而言,int 最终是否比 long 更兼容?由于游戏的性能要求很高,因此从 float 切换到基于长整型的定点数时是否会有很大的性能损失?

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

最佳答案

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

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

您是否研究过decimal 类型?

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

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

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

关于c# - 对于定点数类,我应该坚持使用 32 位还是 64 位类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27997503/

相关文章:

C++ 64 位,未找到变量

mysql - 在 32 位或 64 位 Linux 操作系统服务器上使用 Nginx+mysql 运行 Ruby on Rails + Phusion Passenger 及其性能?

c# - 解析来自 Twitter 的具有多个详细信息的 Json 数据

c# - 如何为 BackgroundService 的 ExecuteAsync 设置超时?

c# - 为什么我可以将 1 作为 short 而不是 int 变量 i 传递?

java - JVM 中 64 位整数的效率是否比 32 位整数低?

c# - ASP.NET MVC 3 中具有 Javascript 操作的 HTML 帮助器

c# - 您使用什么工具和技术来查找死代码?

ruby - 为什么 10^9942066 是我可以计算而不会溢出的最大功率?

从文件中提取后无法将提取的数字转换为 int