物理学中的数据类型

10

我目前正在设计一个涉及一些物理学的程序(没有太高深的内容,只是几个球互相碰撞)

在C#中,我可以使用哪种最精确的数据类型来表示位置(不会有离散跳跃的感觉)?

此外,我可以在t和t + 1之间获得多少最小时间?一个tick吗?

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

8个回答

9
在.Net中,decimal将是您在位置方面可以使用的最精确的数据类型。我会为位置编写一个类:
public class Position
{
    decimal x;
    decimal y;
    decimal z;
}

关于时间,您的处理器无法提供比一个时钟周期更小的时间单位。

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


1
-1:在任何3D游戏计算中,小数很少使用,因为它们太慢了。使用由3个浮点数构建的向量类,您就可以轻松完成所有操作。 - Jon Tackabury
1
+1:对于实数类型,十进制是最精确的,这也是所要求的。 - Rusty

9

根据您的需求,精确但不一定是最佳选择的数据类型是十进制数据类型。通常,Direct3D和GPU使用32位浮点数以及3个向量(总计96位)来表示x,y,z位置。

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

不使用十进制的原因可能是大小(4倍),速度(数量级更慢)以及没有三角函数可用(据我所知)。

在Windows上,QueryPerformanceCounter API函数将为您提供最高分辨率时钟,QueryPerformanceFrequency则提供计数器的频率。我相信在其他评论中描述的Stopwatch将此包装在.net类中。


1
+1:在D3D中,使用三个浮点数构建向量是非常标准的。除非需要更高的精度,否则不建议使用小数,但如果只是一个游戏,就不必担心这个问题。 - Jon Tackabury

5

除非你在做火箭科学,否则十进制数是完全不必要的。虽然它可能会给你更精确的位置,但它并不一定会给你更精确的速度,因为它是一个固定点数据类型,因此其范围比浮点数或双精度浮点数小得多。

使用浮点数,但保持开放态度,以便在精度成为问题时转向双精度浮点数。


3
我会使用矢量数据类型。就像在物理学中,当您想要模拟对象的移动时,您使用向量。使用Vector2XNA框架中的Vector3类,或者自己编写Vector3结构体来表示位置。Vector2用于2D,而Vector3用于3D。 TimeSpan结构体或Stopwatch类是计算时间变化的最佳选择。如果我必须推荐,我会使用Stopwatch。

0

嘿,Juan,我建议你像其他人建议的那样使用Vector3类,因为它易于使用,并且最重要的是 - 支持你需要的所有操作(如加法,乘法,矩阵乘法等...)而无需自己实现。 如果你对如何进行有任何疑问 - 继承它,稍后你总是可以更改内部实现,或者与vector3断开连接。

此外,不要使用比float更不准确的东西 - 所有处理器现在运行得足够快,以至于比整数更准确(除非它是为移动设备设计的,但即使在那里...) 使用小于float的值会很快失去精度,并且最终会出现跳跃的旋转和平移,特别是如果您计划使用多个矩阵/四元数乘法。


0

我不确定我理解你上一个问题的意思,能否请你澄清一下?

编辑:

我可能还是不太明白,但是你可以使用任何类型(例如double)来表示时间(如果你实际想要表示物理问题中时间的离散化,那么tick就无关紧要了)。对于大多数物理问题,double应该足够了。

tick是使用计算机测量时间时可以达到的最佳精度。


0

我认为你应该可以毫无问题地使用十进制数据类型。它具有最高的精度。然而,双精度数据类型也应该可以胜任。

是的,据我所知,滴答是最小的时间单位(使用System.Diagnostics.Stopwatch类)。


0

对于模拟,最好使用十进制/双精度(与位置相同的类型)来表示无量纲时间,并在输入/输出时将其转换为/自有意义。否则,当你移动东西时,你会执行大量的强制转换操作。这种方式还可以获得任意精度,因为你可以选择所需的时间尺度大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接