我試圖做一些質因數分解與我的VBA Excel和我打了long
數據類型的限制 -long類型溢出
運行時錯誤6溢出
有什麼辦法解決這個問題,仍然留在VBA內?我知道顯而易見的是使用另一種更合適的編程語言。
Lance's solution到目前爲止,我能夠將大數目變成現在的變量。然而,當我嘗試應用MOD
功能 - bignumber MOD 2
,例如 - 它仍然失敗,錯誤消息
運行時錯誤6溢出
我試圖做一些質因數分解與我的VBA Excel和我打了long
數據類型的限制 -long類型溢出
運行時錯誤6溢出
有什麼辦法解決這個問題,仍然留在VBA內?我知道顯而易見的是使用另一種更合適的編程語言。
Lance's solution到目前爲止,我能夠將大數目變成現在的變量。然而,當我嘗試應用MOD
功能 - bignumber MOD 2
,例如 - 它仍然失敗,錯誤消息
運行時錯誤6溢出
MOD正在嘗試將DECIMAL類型轉換爲LONG,然後再對其進行操作。您可能需要爲DECIMAL類型編寫自己的MOD功能。你可以試試這個:
r = A - Int(A/B) * B
其中A & B是Variant變量十進制亞型和r可能必須是大也(根據您的需要),雖然我只在很長的測試。
您可以使用十進制數據類型。來自谷歌的快速提示:http://www.ozgrid.com/VBA/convert-to-decimal.htm
這是我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
這裏是我的 「大乘」 例程乘以任意大的數字(例如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
我想你知道,你只需要尋找係數最大爲ROOT(N) – dbb 2008-11-18 07:37:27