2017-06-06 134 views
3

我正在运行以下程序,并且在程序到达a后的第一次迭代中出现溢出错误。根据我的理解,这不应该发生,因为我使用的双倍容量和容量很大,但是由于目前只有100个,所以不应该出现问题,而且代码在很久之前就会失效。这是我原来的输入:运行时错误6 excel中的vba溢出

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 

希望这是一个容易解决。

+4

当'i = 14'(第14次通过循环)和'v = -1.689 x 10^209'时,发生溢出。我不知道你在做什么,但是'v'正在炸毁。如果你描述你正在尝试做什么,这将有所帮助。 –

+0

@John Coleman我现在看到了这个问题,我正在做拖动方程式,我忘了用m来划分一个术语,谢谢。 – Anthrochange

+0

FWIW代码**请求**以解释计算术语和公式。或有意义的标识。或两者。 –

回答

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之前计算

enter image description here

v = v0 + a0 * dt后计算

enter image description here

你在这里看到的是一个非常奇特的行为。 A型Double更改为Integer

这是不正常的,并已经历过。不幸的是,这个问题在Excel中存在了很长一段时间,不幸的是,它也出现在Excel 2016中。它仅在使用非常大的数字时才会出现。这类错误非常罕见,但是,它们确实存在。

人们可以使用MOD如在下面的链接

The MOD Function

+0

哎呀,溢出之前是否有机会发生这种“变态”?或者,如果我们通过“On Error Resume Next”跳过了错误,就坚持下去? –

+0

是的,你可以忽略使用OERN的错误,但我没有测试结果的准确性。我也怀疑数据类型会改回到Double :) –

1
提到,当有类似这样的经历

在越来越溢出问题的变量是诉你将它定义为一个双,其中意味着您只能将数字放在1.79769313486232 * 10^308到4.94065645841247 * 10^-324的范围内。 VBA使用8个字节来保存双重数据。超出此范围的任何数字都会导致溢出。 (有关DBA数据类型的更多信息,请参见here

您希望多大的数字? A rough estimate fo the number of atoms in the universe是1 * 10^82,双值范围几乎达到2 * 10^308。如果您需要处理的数字很大,那么您将不得不使用differentmethod,因为它不符合标准的VBA数据类型。