+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 3 su 3

[VB6] Problemi di conversione da single a double

  1. #1
    L'avatar di spikexx84
    spikexx84 non è in linea Scribacchino
    Ciao a tutti oggi ho avuto una apocalittica battaglia con un problema che non riuscivo a risolvere, ovvero io ho un modulo di classe che lavora per scrivere dei file pdf e che usa coordinate di tipo single per decidere le coordinate delle scritte, delle linee, delle immagini, eccetera... Io non uso mai il tipo single ma sempre il double, comunque ho pensato nessun problema tanto un numero è un numero e non vado certo oltre le cinque cifre decimali per la posizione di una scritta.
    Ma... PROBLEMA gli if non funzionano; i calcoli escono sballati; E io non ci capisco più un c***o (scusate lo sfogo)

    Alla fine trovo che c'è un problema di conversione da single a double nelle operazioni: esempio
    Private Sub Command1_Click()
        Dim n_prova As Single
        Dim n_Prova2 As Single
     
        Dim n_Prova3 As Double
     
        n_prova = 1.5
        n_Prova2 = 1.7
     
        n_Prova3 = n_Prova2 - n_prova
     
        MsgBox n_Prova3
    End Sub
    
    Ora il mio collega mi ha detto che è un problema delle operazioni fra numeri con virgola mobile, io gli credo (anche perchè ci sono delle prove schiaccianti come mostrato sopra), ma vorrei chiedere a voi se sapreste indicarmi un articolo un qualcosa che mi spieghi il perchè di questo tipo di errori e magari qualche indicazione su come fate voi per aggirarli...

    Ringrazio in anticipo chiunque avrà la pazienza e la capacità per rispondermi

  2. #2
    L'avatar di IceCube_MD
    IceCube_MD non è in linea Scolaretto
    Quote Originariamente inviato da spikexx84 Visualizza il messaggio
    Ciao a tutti oggi ho avuto una apocalittica battaglia con un problema che non riuscivo a risolvere, ovvero io ho un modulo di classe che lavora per scrivere dei file pdf e che usa coordinate di tipo single per decidere le coordinate delle scritte, delle linee, delle immagini, eccetera... Io non uso mai il tipo single ma sempre il double, comunque ho pensato nessun problema tanto un numero è un numero e non vado certo oltre le cinque cifre decimali per la posizione di una scritta.
    Ma... PROBLEMA gli if non funzionano; i calcoli escono sballati; E io non ci capisco più un c***o (scusate lo sfogo)

    Alla fine trovo che c'è un problema di conversione da single a double nelle operazioni: esempio
    Private Sub Command1_Click()
        Dim n_prova As Single
        Dim n_Prova2 As Single
     
        Dim n_Prova3 As Double
     
        n_prova = 1.5
        n_Prova2 = 1.7
     
        n_Prova3 = n_Prova2 - n_prova
     
        MsgBox n_Prova3
    End Sub
    
    Ora il mio collega mi ha detto che è un problema delle operazioni fra numeri con virgola mobile, io gli credo (anche perchè ci sono delle prove schiaccianti come mostrato sopra), ma vorrei chiedere a voi se sapreste indicarmi un articolo un qualcosa che mi spieghi il perchè di questo tipo di errori e magari qualche indicazione su come fate voi per aggirarli...

    Ringrazio in anticipo chiunque avrà la pazienza e la capacità per rispondermi
    Ciao. Non sono in grado di allegarti un link ad un articolo, ma se cerchi su Google qualcosa come: "rappresentazione numeri floating point", magari associatoa VB6, qualcosa trovi sicuro...

    Come risolvere il problema e' comunque molto semplice: basta usare la funzione Round, che arrotonda un numero alle cifre decimali desiderate, PRIMA della visualizzazione del numero.

    Per comodita' potresti inglobare il tutto in una funzione ad-hoc, ad esempio se di solito usi la funzione nativa CStr per trasformare un numero in stringa da visualizzare, potresti definire una funzione come DStr che PRIMA arrotondi un Double alla 5' cifra decimale (ad esempio):
    Function DStr(ByVal N As Double) As String
       DStr = CStr(Round(N, 5))
    End Function
    
    sostituendo nel tuo esempio:
    MsgBox n_Prova3 con MsgBox DStr(n_Prova3)
    visualizzerai un risultato piu' in linea con le tua aspettative...


    N.B.: per la cronaca, il problema non sta' nella conversione Single-Double, ma nella stessa rappresentazione INTERNA dei valori floating point, che utilizza le potenze di due (e i suoi recicproci), e NON e' eliminabile alla fonte.

  3. #3
    L'avatar di spikexx84
    spikexx84 non è in linea Scribacchino
    Grazie della risposta mi confermi quello che ho trovato io informandomi, anche se veramente il mio problema non arriva dal fatto di mostrare a video dei SIngle o dei Double (per cui mi è più che sufficente la formatNumber) ma dal fatto che devo fare dei confronti, restando sull'esempio di prima....

    Private Sub Command1_Click()
        Dim n_prova As Single
        Dim n_Prova2 As Single
     
        Dim n_Prova3 As Double
     
        n_prova = 1.5
        n_Prova2 = 1.7
     
        n_Prova3 = n_Prova2 - n_prova
     
        MsgBox CBool(n_Prova3 = 0.2)
    End Sub
    
    Comunque adesso che lo sò starò molto più attento, utilizzando funzioni di arrotondamento e cast dovrei riuscire a risolvere il problema...

    Grazie ancora della risposta

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Problemi double java c++
    Da TeleSystemMaster nel forum C/C++
    Risposte: 14
    Ultimo Post: 08-09-2015, 21:51
  2. Risposte: 4
    Ultimo Post: 27-02-2012, 10:08
  3. problemi nella conversione da VB3 a VB6
    Da Mariano nel forum Visual Basic 6
    Risposte: 6
    Ultimo Post: 12-06-2010, 17:42
  4. Conversione Single - Double
    Da Badthing nel forum Visual Basic 6
    Risposte: 6
    Ultimo Post: 25-11-2007, 12:17
  5. [C#] Problemi di conversione
    Da Zigo nel forum C#
    Risposte: 3
    Ultimo Post: 01-02-2006, 15:44