2008-11-17 130 views
2

我試圖做一些質因數分解與我的VBA Excel和我打了long數據類型的限制 -long類型溢出

運行時錯誤6溢出

有什麼辦法解決這個問題,仍然留在VBA內?我知道顯而易見的是使用另一種更合適的編程語言。


Lance's solution到目前爲止,我能夠將大數目變成現在的變量。然而,當我嘗試應用MOD功能 - bignumber MOD 2,例如 - 它仍然失敗,錯誤消息

運行時錯誤6溢出

+0

我想你知道,你只需要尋找係數最大爲ROOT(N) – dbb 2008-11-18 07:37:27

回答

1

MOD正在嘗試將DECIMAL類型轉換爲LONG,然後再對其進行操作。您可能需要爲DECIMAL類型編寫自己的MOD功能。你可以試試這個:

r = A - Int(A/B) * B 

其中A & B是Variant變量十進制亞型和r可能必須是大也(根據您的需要),雖然我只在很長的測試。

2

這是我Decimals.cls(VB6):

VERSION 1.0 CLASS 
BEGIN 
    MultiUse = -1 'True 
    Persistable = 0 'NotPersistable 
    DataBindingBehavior = 0 'vbNone 
    DataSourceBehavior = 0 'vbNone 
    MTSTransactionMode = 0 'NotAnMTSObject 
END 
Attribute VB_Name = "Decimals" 
Attribute VB_GlobalNameSpace = False 
Attribute VB_Creatable = True 
Attribute VB_PredeclaredId = False 
Attribute VB_Exposed = True 
Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes" 
Attribute VB_Ext_KEY = "Top_Level" ,"Yes" 
Option Explicit 

'local variable(s) to hold property value(s) 
Private mvarDec As Variant 'local copy 

Public Property Let Dec(ByVal vData As Variant) 
'used when assigning a value to the property, on the left side of an assignment. 
'Syntax: X.Dec = 5 
    mvarDec = CDec(vData) 
End Property 

Public Property Get Dec() As Variant 
Attribute Dec.VB_UserMemId = 0 
'used when retrieving value of a property, on the right side of an assignment. 
'Syntax: Debug.Print X.Dec 
    Dec = CDec(mvarDec) 
End Property 

,這是一個測試程序。這個類已經設置好,所以你不必在.dec()上獲取和讓出。

Dim dec1 As New Std.Decimals 
Dim dec2 As New Std.Decimals 
Dim dec3 As New Std.Decimals 
Dim modulus As New Std.Decimals 

Sub main() 
    dec1 = "1000.000000001" 
    dec2 = "1000.00000000000001" 
    dec3 = dec1 + dec2 
    Debug.Print dec1 
    Debug.Print dec2 
    Debug.Print dec3 
    Debug.Print dec3 * dec3 
    Debug.Print dec3/10 
    Debug.Print dec3/100 
    Debug.Print Sqr(dec3) 
    modulus = dec1 - Int(dec1/dec2) * dec2 
    Debug.Print modulus 
End Sub 

和樣品運行

1000.000000001 
1000.00000000000001 
2000.00000000100001 
4000000.000004000040000001 
200.000000000100001 
20.0000000000100001 
44.721359550007 
0.00000000099999 
1000.000000001 
1000.00000000000001 
2000.00000000100001 
4000000.000004000040000001 
200.000000000100001 
20.0000000000100001 
44.721359550007 
0.00000000099999 
2

這裏是我的 「大乘」 例程乘以任意大的數字(例如100個字符)。它通過將輸入數字(字符串)拆分爲7位數字塊(因爲它可以將它們交叉相乘並將結果存儲在雙精度中)。

如bigmultiply( 「1934567803945969696433」, 「4483838382211678」)= 8674289372323895422678848864807544574

Function BigMultiply(ByVal s1 As String, ByVal s2 As String) As String 

Dim x As Long 
x = 7 

Dim n1 As Long, n2 As Long, n As Long 
n1 = Int(Len(s1)/x + 0.999999) 
n2 = Int(Len(s2)/x + 0.999999) 
n = n1 + n2 

Dim i As Long, j As Long 
ReDim za1(n1) As Double 
i = Len(s1) Mod x 
If i = 0 Then i = x 
za1(1) = Left(s1, i) 
i = i + 1 
For j = 2 To n1 
za1(j) = Mid(s1, i, x) 
i = i + x 
Next j 

ReDim za2(n2) As Double 
i = Len(s2) Mod x 
If i = 0 Then i = x 
za2(1) = Left(s2, i) 
i = i + 1 
For j = 2 To n2 
za2(j) = Mid(s2, i, x) 
i = i + x 
Next j 

ReDim z(n) As Double 
Dim u1 As Long, u2 As Long 
Dim e As String 
e = String(x, "0") 

For u1 = 1 To n1 
i = u1 
For u2 = 1 To n2 
    i = i + 1 
    z(i) = z(i) + za1(u1) * za2(u2) 
Next u2 
Next u1 

Dim s As String, y As Double, w As Double, m As Long 
m = n * x 
s = String(m, "0") 
y = 10^x 
For i = n To 1 Step -1 
w = Int(z(i)/y) 
Mid(s, i * x - x + 1, x) = Format(z(i) - w * y, e) 
z(i - 1) = z(i - 1) + w 
Next i 
'truncate leading zeros 
For i = 1 To m 
If Mid$(s, i, 1) <> "0" Then Exit For 
Next i 
If i > m Then 
BigMultiply = "" 
Else 
BigMultiply = Mid$(s, i) 
End If 

End Function