我目前正在设计一个涉及一些物理的程序(没什么太花哨的,几个球互相碰撞)

在 C# 中,我可以用来表示位置(没有离散跳跃的感觉)的最精确的数据类型是什么?

另外,在 t 和 t+1 之间我能得到的最小时间是多少?一勾?

编辑:澄清:C#中最小的时间单位是什么? [TimeSpan].Tick?

有帮助吗?

解决方案

在.Net中 decimal 将是您可以用于定位的最精确的数据类型。我只想为这个职位写一个课程:

public class Position
{
    decimal x;
    decimal y;
    decimal z;
}

至于时间,你的处理器无法给你任何小于一滴答的时间。

听起来是一个有趣的项目!祝你好运!

其他提示

Decimal 数据类型虽然精确,但可能不是最佳选择,具体取决于您想要执行的操作。一般来说,Direct3D 和 GPU 使用 32 位浮点数和 3 向量(总共 96 位)来表示 x、y、z 中的位置。

这通常会提供足够的精度,除非您需要在同一个“世界”中混合大规模(行星)和微观水平(篮球)。

不使用小数的原因可能是大小(大 4 倍)、速度(慢几个数量级)和没有可用的三角函数(AFAIK)。

在 Windows 上, 查询性能计数器 API函数将为您提供最高分辨率的时钟,并且 查询性能频率 计数器的频率。我相信其他评论中描述的秒表将其包装在 .net 类中。

除非你从事的是火箭科学,否则小数就太过分了。尽管它可能会为您提供更精确的位置,但它不一定会为您提供更精确的(例如)速度,因为它是定点数据类型,因此限制范围比浮点或双精度要小得多。

使用浮动,但要打开门以移动到双倍,以防精度出现问题。

我会使用向量数据类型。就像在物理学中一样,当你想要模拟物体的运动时,你可以使用向量。用一个 向量2 或者 XNA 中的 Vector3 类 框架或滚动你的 自己的 Vector3 结构 来代表立场。Vector2 用于 2D,Vector3 用于 3D。

时间跨度 结构体或 跑表 class 将是您计算时间变化的最佳选择。如果我必须推荐的话,我会使用秒表。

我认为您应该能够毫无问题地使用 Decimal 数据类型。它具有最高精度。然而,双精度数据类型应该没问题。

是的,刻度是我所知道的最小的(使用 System.Diagnostics.Stopwatch 类)。

我不确定我是否理解你的最后一个问题,你能澄清一下吗?

编辑:

我可能仍然不明白,但您可以使用任何您想要的类型(例如,双精度)来表示时间(如果您真正想要的是表示物理问题的时间离散化,在这种情况下,刻度线无关紧要)。对于大多数物理问题,双精度就足够了。

刻度是使用机器测量时间时可以达到的最佳精度。

对于模拟,您可能最好在无量纲时间中使用小数/双精度(与位置相同的类型),然后将其从/转换为对输入/输出有意义的东西。否则,当您移动物体时,您将执行大量的强制转换操作。您也可以通过这种方式获得任意精度,因为您可以根据需要选择时间刻度的大小。

嘿,Juan,我建议您按照其他几个人的建议使用 Vector3 类,因为它很容易使用,最重要的是 - 支持您需要的所有操作(如加法、乘法、矩阵乘法等...),而无需实现你自己吧。如果您对如何继续有任何疑问 - 继承它,在稍后阶段您可以随时更改内部实现,或断开与 vector3 的连接。

另外,不要使用比浮点更准确的东西 - 如今所有处理器运行得足够快,可以比整数更准确(除非它是用于移动的,否则即使在那里...)使用少于浮点最终以跳高的旋转和翻译,尤其是如果您计划使用超过单个矩阵/四元素乘法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top