2017-12-25 16 views
1

以下私は書いた基数58の変換のための私のプロジェクトのコードを持っています。 2つの小さな数字の残りの部分はうまくいきますが、例えば、1.03475761285374E + 33のように2つの大きな数字の残りの部分を取得しようとすると、0が返されます。倍を分割して余りを得る方法はありますか?倍精度を返す0

Function Base58Value(sInput As String) As String 

'reverse the input 
sInput = StrReverse(sInput) 

'get the length of the input string 
Dim inputLen As Long 
inputLen = Len(sInput) 

'set up an array for each character 
Dim sCharacter() As Integer 
ReDim sCharacter(inputLen) 

'set up an array for step 2 - index times 8 to the 2nd power 
Dim sStep2() As Double 
ReDim sStep2(inputLen) 

'set up an array or step 3 
Dim sStep3() As Double 
ReDim sStep3(inputLen) 

Dim sFinalNumber As Double 
For x = 1 To inputLen 
curchar$ = Mid(sInput, x, 1) 
sCharacter(x) = Asc(curchar) 
sStep2(x) = 2^((x - 1) * 8) 
sStep3(x) = sCharacter(x) * sStep2(x) 
sFinalNumber = sFinalNumber + sStep3(x) 
Next x 

Dim sRemainder() As Integer 
ReDim sRemainder(0) 
Dim sValue As Double 
sValue = sFinalNumber 
Dim sNextValue As Double 
Dim sIter As Long 
sIter = 0 

Do Until Fix(sValue) = 0 
DoEvents 
ReDim Preserve sRemainder(sIter + 1) 
sRemainder(sIter) = sMod(Fix(sValue), 58) 
sValue = Fix(sValue/58) 
sIter = sIter + 1 
Loop 

Dim ConversionTable$ 
ConversionTable = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" 
Dim addValues As String 
addValues = "" 
Dim xI As Integer 
For xI = 0 To UBound(sRemainder) - 1 
DoEvents 
List1.AddItem (sRemainder(xI)) 
addValues = addValues + Mid(ConversionTable, sRemainder(xI) + 1, 1) 
Next xI 

Base58Value = StrReverse(addValues) 

End Function 

Public Function sMod(a, b) 
Dim x As Variant 
x = a/b 
x = x - Fix(x) 
x = x * b 
sMod = x 
End Function 
+0

両方の大きな数値の縮尺を、例えば1E20で除算し、その結果に同じ値を乗じて変更します。 –

答えて

1

実際にあなたのコードが何を解析することなく、私は、浮動小数点値は、範囲と精度の間の妥協を表していると言うだろう:それは両方のすべてを持ってすることはできません。非常に大きなフロートは、必ずしも非常に正確な値を格納することができません。

VB doubleには実際の精度が約53ビットしかないため、正確に格納できる最大の整数は約15桁です。

代わりに小数点(バリアント)を使用してください。私が言ったように、あなたのコードを分析しなかったので、彼らはあなたが必要とするものをやるかどうか分からない。しかし、2倍の2倍の2倍の10進数で、拡張精度を提供します。