Newsgroup: it.comp.lang.visual-basic
Titolo: Moltiplicazione numeri Hex [URGENTE, please]

Ciao a tutti
ho un problema urgente (chi mi ha dato il lavoro č impaziente che venga
terminato, e certo sapete cosa significa avere un capo *impaziente*...)
Comunque, dovrei moltiplicare tre numeri in formato esadecimale del tipo:
&h45AB98 * &h8945DF * &hFF56AD78
Dunque:
1) Eseguendo brutalmente l'operazione (cosě com'č scritta) VB va in overflow
2) Convertendo i numeri i decimale e moltiplicandoli si perdono cifre
significative (infatti dopo una decina di cifre VB passa in notazione
scientifica 45E+22)
3) Per ovviare al problema precedente ho utilizzato un
format(moltip.,"0000000000000000000000000000000") ma non serve poichč VB
taglia comunque le cifre. Inoltre ho riscontrato una stranissima quanto
piuttosto evidente differenza fra il valore calcolato con VB e con la
calcolatrice di Windows. Bho?!
4) Ho tentato di convertire "manualmente" da Hex a binario e poi effettuare
a mano la moltiplicazione... ma c'č da diventare scemi (solo un po', perň
non mi va:-)
Ora, esiste un modo per moltiplicare (senza usare funzioni intrinseche di
VB, con i limiti che hanno) due numeri esadecimali, senza doverli convertire
in altri formati?
Grazie infinite
Marco Trapanese

 wrote in message
8lar7b$mbv$1...@nslave2.tin.it...


1) Eseguendo brutalmente l'operazione (cosě com'č scritta) VB va in
overflow
Il problema č che se vuoi come risultato dei numeri interi VB si fermerŕ al
massimo per i long (&H7FFFFFFF = 2.14miliardi).
Puoi provare a convertire i valori in Double, ma i tuoi numeri mi sembrano
comunque molto alti.
Ciao.


Appunto, come si può fare per aggirare l'ostacolo, non so eseguendo
manualmente l'operazione (ad esempio con una routine ricorsiva)? avete
qualche idea?
Ciao
Marco Trapanese

...


 che perň, non ho avuto ancora tempo di realizzare.


 &h45AB98 * &h8945DF * &hFF56AD78
Il risultato č un po' altino per stare nei tipo standard
Sul mio sito, nella sezione "Procedure" trovi DifferenzaG, ProdottoG e
SommaG.
Si tratta di funzioni in grado di gestire numeri interi giganti.
Spero di riuscire a caricarle perchč le ho appena preparate e non riesco a
collegarmi con il server FTP.
Spero che siano ciň che fa al caso tuo.
--
Diego Mazzaro
"L'importante non č conoscere tante cose ma sapere dove trovarle" A.
Einstein
http://space.tin.it/computer/btqmaz/diego

 collegarmi con il server FTP.
In effetti non riesco a connettermi con il mio ftp.
Scusa per il disturbo, cerco di provvedere ma a questo punto no so i
tempi...


 Spero di riuscire a caricarle perchè le ho appena preparate e non riesco a
Visto che non ci riesco la posto qui:
Private Function ProdottoG(ByVal x As String, ByVal y As String) As String
    '******************************************
    '* Questa funzione serve a calcolare il   *
    '* prodotto di numeri interi molto grandi *
    '******************************************
    '**************************************************
    'Procedure e funzioni richieste:
    '-- SommaG
    '**************************************************
    '® ® ® ® ® ® ® ® ® ® ® ® ® ® ® ® ®
    '® Scritta da MAZZARO DIEGO      ®
    '® ® ® ® ® ® ® ® ® ® ® ® ® ® ® ® ®
    '++ Versione 1.0.0 ++
    '++ Ultima modifica: 23/07/2000 ++
    Dim Parte1 As Double, Parte2 As Double
    Dim Parziale As String, tmpy As String
    Dim c1 As Long, c2 As Long, Segno As String
    Const MaxLen As Integer = 4
    If Left(x, 1) = "-" Then
        c1 = 1
        x = Right(x, Len(x) - 1)
    End If
    If Left(y, 1) = "-" Then
        c1 = 1 - c1
        y = Right(y, Len(y) - 1)
    End If
    If c1 = 1 Then Segno = "-"
    tmpy = y
    c1 = -MaxLen
    Do
        Parte1 = Val(Right(x, MaxLen))
        x = Left(x, (Len(x) - MaxLen) * (Sgn(Sgn(Len(x) - MaxLen) - 1) + 1))
        c1 = c1 + MaxLen
        y = tmpy
        c2 = -MaxLen
        Do
            Parte2 = Val(Right(y, MaxLen))
            y = Left(y, (Len(y) - MaxLen) * (Sgn(Sgn(Len(y) - MaxLen) - 1) +
1))
            c2 = c2 + MaxLen
            Parziale = CStr(Parte1 * Parte2) + String(c1 + c2, "0")
            ProdottoG = SommaG(ProdottoG, Parziale)
        Loop Until y = ""
    Loop Until x = ""
    If Len(ProdottoG) = 0 Then
        ProdottoG = "0"
    Else
        ProdottoG = Segno + ProdottoG
    End If
End Function
Private Function SommaG(ByVal x As String, ByVal y As String) As String
    '****************************************
    '* Questa funzione serve a calcolare la *
    '* somma di numeri interi molto grandi  *
    '****************************************
    '**************************************************
    'Procedure e funzioni richieste:
    '-- DifferenzaG
    '**************************************************
    '® ® ® ® ® ® ® ® ® ® ® ® ® ® ® ® ®
    '® Scritta da MAZZARO DIEGO      ®
    '® ® ® ® ® ® ® ® ® ® ® ® ® ® ® ® ®
    '++ Versione 1.0.0 ++
    '++ Ultima modifica: 23/07/2000 ++
    Dim Parte1 As Double, Parte2 As Double
    Dim Riporto As Integer, Temp As String
    Dim c1 As Integer, c2 As Integer
    Const MaxLen As Integer = 10
    If Left(x, 1) = "-" Then
        c1 = 1
        x = Right(x, Len(x) - 1)
    End If
    If Left(y, 1) = "-" Then
        c2 = 1
        y = Right(y, Len(y) - 1)
    End If
    If (c1 + c2) Mod 2 = 0 Then
        Do
            Parte1 = Val(Right(x, MaxLen))
            x = Left(x, (Len(x) - MaxLen) * (Sgn(Sgn(Len(x) - MaxLen) - 1) +
1))
            Parte2 = Val(Right(y, MaxLen))
            y = Left(y, (Len(y) - MaxLen) * (Sgn(Sgn(Len(y) - MaxLen) - 1) +
1))
            Temp = CStr(Parte1 + Parte2 + Riporto)
            Riporto = Val(Left(Temp, (Len(Temp) - MaxLen) *
(Sgn(Sgn(Len(Temp) - MaxLen) - 1) + 1)))
            Temp = Right(Temp, MaxLen)
            SommaG = Format(Temp, String(MaxLen, "0")) + SommaG
        Loop Until x = "" And y = ""
        Do While Left(SommaG, 1) = "0"
            SommaG = Right(SommaG, Len(SommaG) - 1)
        Loop
        If c1 + c2 = 2 Then SommaG = "-" + SommaG
    Else
        If c1 = 1 Then
            SommaG = DifferenzaG(y, x)
        Else
            SommaG = DifferenzaG(x, y)
        End If
    End If
End Function
Private Function DifferenzaG(ByVal x As String, ByVal y As String) As String
    '***************************************************
    '* Questa funzione serve a calcolare la differenza *
    '* di due numeri interi con molte cifre            *
    '***************************************************
    '**************************************************
    'Procedure e funzioni richieste:
    '-- SommaG
    '**************************************************
    '® ® ® ® ® ® ® ® ® ® ® ® ® ® ® ® ®
    '® Scritta da MAZZARO DIEGO      ®
    '® ® ® ® ® ® ® ® ® ® ® ® ® ® ® ® ®
    '++ Versione 1.0.0 ++
    '++ Ultima modifica: 23/07/2000 ++
    Dim Parte1 As Double, Parte2 As Double
    Dim Riporto As Integer, Temp As String, c As Long
    Dim Segno As String, tmpVal As Double
    Dim c1 As Integer, c2 As Integer
    Const MaxLen As Integer = 10
    If Left(x, 1) = "-" Then
        c1 = 1
        x = Right(x, Len(x) - 1)
    End If
    If Left(y, 1) = "-" Then
        c2 = 1
        y = Right(y, Len(y) - 1)
    End If
    If (c1 + c2) Mod 2 = 0 Then
        If Len(x) < Len(y) Then
            Segno = "-"
        ElseIf Len(x) = Len(y) Then
            For c = 1 To Len(x) Step 10
                If Mid(x, c, MaxLen) < Mid(y, c, MaxLen) Then
                    Segno = "-"
                    Exit For
                End If
            Next c
        End If
        If Segno = "-" Then
            Temp = x
            x = y
            y = Temp
            Temp = ""
            If c1 + c2 = 2 Then Segno = ""
        Else
            If c1 + c2 = 2 Then Segno = "-"
        End If
        Do
            Parte1 = Val(Right(x, MaxLen))
            x = Left(x, (Len(x) - MaxLen) * (Sgn(Sgn(Len(x) - MaxLen) - 1) +
1))
            Parte2 = Val(Right(y, MaxLen))
            y = Left(y, (Len(y) - MaxLen) * (Sgn(Sgn(Len(y) - MaxLen) - 1) +
1))
            tmpVal = Parte1 - Parte2 - Riporto
            If tmpVal < 0 Then
                Riporto = 1
                tmpVal = 10 ^ MaxLen + tmpVal
            Else
                Riporto = 0
            End If
            DifferenzaG = Format(tmpVal, String(MaxLen, "0")) + DifferenzaG
        Loop Until x = "" And y = ""
        Do While Left(DifferenzaG, 1) = "0"
            DifferenzaG = Right(DifferenzaG, Len(DifferenzaG) - 1)
        Loop
        DifferenzaG = Segno + DifferenzaG
        If Len(DifferenzaG) = 0 Then DifferenzaG = "0"
    Else
        If c1 = 1 Then
            DifferenzaG = SommaG(x, y)
            If Len(DifferenzaG) <> 0 Then DifferenzaG = "-" + DifferenzaG
        End If
        If c2 = 1 Then DifferenzaG = SommaG(x, y)
    End If
End Function


 ha scritto nel messaggio
news:8lhtkg$cn3$2...@nslave1.tin.it...
