题
我目前正在设计一个涉及一些物理的程序(没什么太花哨的,几个球互相碰撞)
在 C# 中,我可以用来表示位置(没有离散跳跃的感觉)的最精确的数据类型是什么?
另外,在 t 和 t+1 之间我能得到的最小时间是多少?一勾?
编辑:澄清:C#中最小的时间单位是什么? [TimeSpan].Tick
?
解决方案
在.Net中 decimal
将是您可以用于定位的最精确的数据类型。我只想为这个职位写一个课程:
public class Position
{
decimal x;
decimal y;
decimal z;
}
至于时间,你的处理器无法给你任何小于一滴答的时间。
听起来是一个有趣的项目!祝你好运!
其他提示
除非你从事的是火箭科学,否则小数就太过分了。尽管它可能会为您提供更精确的位置,但它不一定会为您提供更精确的(例如)速度,因为它是定点数据类型,因此限制范围比浮点或双精度要小得多。
使用浮动,但要打开门以移动到双倍,以防精度出现问题。
我会使用向量数据类型。就像在物理学中一样,当你想要模拟物体的运动时,你可以使用向量。用一个 向量2 或者 XNA 中的 Vector3 类 框架或滚动你的 自己的 Vector3 结构 来代表立场。Vector2 用于 2D,Vector3 用于 3D。
我认为您应该能够毫无问题地使用 Decimal 数据类型。它具有最高精度。然而,双精度数据类型应该没问题。
是的,刻度是我所知道的最小的(使用 System.Diagnostics.Stopwatch 类)。
我不确定我是否理解你的最后一个问题,你能澄清一下吗?
编辑:
我可能仍然不明白,但您可以使用任何您想要的类型(例如,双精度)来表示时间(如果您真正想要的是表示物理问题的时间离散化,在这种情况下,刻度线无关紧要)。对于大多数物理问题,双精度就足够了。
刻度是使用机器测量时间时可以达到的最佳精度。
对于模拟,您可能最好在无量纲时间中使用小数/双精度(与位置相同的类型),然后将其从/转换为对输入/输出有意义的东西。否则,当您移动物体时,您将执行大量的强制转换操作。您也可以通过这种方式获得任意精度,因为您可以根据需要选择时间刻度的大小。
嘿,Juan,我建议您按照其他几个人的建议使用 Vector3 类,因为它很容易使用,最重要的是 - 支持您需要的所有操作(如加法、乘法、矩阵乘法等...),而无需实现你自己吧。如果您对如何继续有任何疑问 - 继承它,在稍后阶段您可以随时更改内部实现,或断开与 vector3 的连接。
另外,不要使用比浮点更准确的东西 - 如今所有处理器运行得足够快,可以比整数更准确(除非它是用于移动的,否则即使在那里...)使用少于浮点最终以跳高的旋转和翻译,尤其是如果您计划使用超过单个矩阵/四元素乘法。