2017-06-06 133 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數據類型。