2008-11-17 132 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