我正在运行以下程序,并在程序到达a
后第一次迭代时出现溢出错误。根据我的理解,这不应该发生,因为我使用的是具有荒谬容量的双打,而且是Long,但是因为它目前只有100,所以它应该无关紧要,并且代码在此之前很久就失败了。这是我的原始输入:
h0 = 1000, v0 = 0, a0 = g = -9.80665, dt = .01, m = 752.2528, b = .287875
这是代码:
Sub drag()
Dim h0 As Double
Dim v0 As Double
Dim a0 As Double
Dim dt As Double
Dim m As Double
Dim b As Double
Dim g As Double
Dim i As Long
Dim h As Double
Dim v As Double
Dim a As Double
h0 = Worksheets("Drag").Cells(2, 8).Value
v0 = Worksheets("Drag").Cells(2, 9).Value
a0 = Worksheets("Drag").Cells(2, 10).Value
g = Worksheets("Drag").Cells(2, 10).Value
dt = Worksheets("Drag").Cells(2, 7).Value
m = Worksheets("Drag").Cells(2, 4).Value
b = Worksheets("Drag").Cells(2, 5).Value
Debug.Print h0 & v0 & a0 & dt & m & b
For i = 1 To 100
v = v0 + a0 * dt
h = 0.5 * a0 * (dt ^ 2) + v0 * dt + h0
a = m * g - b * (v ^ 2) 'Line where overflow occurs
v0 = v
h0 = h
a0 = a
Cells(i + 2, 8) = h0
Cells(i + 2, 9) = v0
Cells(i + 2, 10) = a0
Next i
Debug.Print h0 & v0 & a0 & dt & m & b
End Sub
希望这是一个简单的解决方案。
答案 0 :(得分:5)
当i = 14(第14次通过循环)和v = -1.689 x 10 ^ 209时,会发生溢出。我不知道你想要做什么,但是v正在爆炸。如果你描述你想要做的事情会有所帮助。 - 约翰科尔曼17分钟前
@John Coleman我现在看到了这个问题,我正在做拖曳等式,我忘了把一个术语除以m,谢谢。 - Anthrochange 9分钟前
您已经确定了需要做什么。
现在解释为什么溢出m * g - b * (v ^ 2)
。我添加了一个手表,如下所示
考虑前后截图
在计算v = v0 + a0 * dt
之前
计算v = v0 + a0 * dt
后
你在这里看到的是一种非常奇特的行为。类型Double
更改为Integer
这是不正常的,以前经历过。不幸的是,Excel中存在这个问题很长一段时间,遗憾的是Excel 2016中也存在此问题。仅当您使用非常大的数字时才会出现此问题。这些错误非常罕见,但是,确实存在。
使用MOD
时可以获得类似的体验,如下面链接
答案 1 :(得分:1)
正在获得溢出的变量是v。您将其定义为double,这意味着您只能将数字放在1.79769313486232 * 10 ^ 308到4.94065645841247 * 10 ^ -324的范围内。 VBA使用8个字节来保存双数据。超出这个巨大范围的任何数字都会导致溢出。 (有关DBA数据类型的更多信息,请参阅here)
你期待的数字有多大? rough estimate fo the number of atoms in the universe是1 * 10 ^ 82,双值范围几乎是2 * 10 ^ 308。如果您需要使用较大的数字,那么您将不得不使用different method,因为它根本不适合标准的VBA数据类型。