Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    VB6, confronto tra variabili double

    salve,
    vorrei sottoporvi il seguente codice:

    codice:
    Private Sub Command1_Click()
        Dim actual As Double
        Dim expected As Double
        Dim expected1 As Double
        Dim expected2 As Double
        
        actual = 0.1
        expected1 = 0.09
        expected2 = 0.01
        expected = expected1 + expected2
        
        If actual <= expected Then
            MsgBox "ciao"
        End If
        
    End Sub
    dove si fa un confronto tra double, come si vede, la variabile expected viene posta pari alla somma di expected1 e expected2, ovvero 0.1, quindi il confronto con actual, che vale 0.1, dovrebbe tornare true, mentre torna false!
    Qualcuno sa come mai, e come ovviare al problema?

  2. #2
    Moderatore di CMS L'avatar di kalosjo
    Registrato dal
    Jul 2001
    residenza
    In culo alla luna
    Messaggi
    1,999
    Errore del processore matematico....

    C'è un arrotondamento di 10 elevato a -17 .....

    Microzzozz ha colpito ancora

    Prova a fare

    MsgBox (actual - expected)

    fuori dall'if e vedi...
    Scusate i puntini di sospensione...... La verità è che non ho argomenti....

  3. #3
    hai ragione... la differenza non fa 0...

    immagino allora che questa differenza vari da macchina a macchina, a seconda di dove viene eseguitio il programma

  4. #4
    Moderatore di CMS L'avatar di kalosjo
    Registrato dal
    Jul 2001
    residenza
    In culo alla luna
    Messaggi
    1,999
    Originariamente inviato da jackmoros
    hai ragione... la differenza non fa 0...

    immagino allora che questa differenza vari da macchina a macchina, a seconda di dove viene eseguitio il programma


    Chiedi a zio Bill...
    Scusate i puntini di sospensione...... La verità è che non ho argomenti....

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da jackmoros
    immagino allora che questa differenza vari da macchina a macchina, a seconda di dove viene eseguitio il programma
    Non è un problema di sistema operativo, né di macchina e né di Microsoft quanto più di CPU e della natura del trattamento dei valori a virgola mobile: sono permeati da un errore di precisione che rende sostanzialmente impossibile confrontare due valori e determinarne una esatta uguaglianza.

    Il massimo che puoi fare è stabilire un "margine di differenza" e verificare se il valore assoluto della differenza dei due valori supera la soglia prestabilita oppure no; in quest'ultimo caso, puoi ipotizzare che i valori siano uguali (li consideri tali).

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #6
    Moderatore di CMS L'avatar di kalosjo
    Registrato dal
    Jul 2001
    residenza
    In culo alla luna
    Messaggi
    1,999
    Utilizza il round
    Scusate i puntini di sospensione...... La verità è che non ho argomenti....

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da kalosjo
    Utilizza il round
    Quale vantaggio porta il Round nel confronto tra valori decimali? Inoltre, l'algoritmo usa la distribuzione dell'errore di arrotondamento statistica che potrebbe dare risultati positivi per valori diversi, senza contare che arrotondare due valori e confrontarli è un'operazione meno performante rispetto al confronto diretto con il valore assoluto.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.