L'aggiunta di double non è uguale alla somma del doppio nel suo insieme

2

Sono a conoscenza degli errori in virgola mobile poiché avevo acquisito una certa conoscenza con la mia domanda posta qui in SE Errori in virgola mobile.

Quello che trovo difficile da capire è l'output del seguente programma.

        double d1 = 0 + 1.123 + 2.456;
        double d2 = 3.579;

        float f1 = 0f + 1.123f + 2.456f;
        float f2 = 3.579f;

        long l1 = (long)(0 + 1.123 + 2.456);
        long l2 = (long)3.579;

        System.out.println(d1==d2);  // Output = false;
        System.out.println(f1==f2);  // Output = true;
        System.out.println(l1==l2);  // Output = true;

Why is the output "false" for double and not for float, even when float is single precision 32 bit and double is double precision 64 bit. Oracle docs

Qualsiasi aiuto con questo sarebbe molto apprezzato.

    
posta JNL 18.07.2013 - 23:10
fonte

1 risposta

9

Considera questa ipotesi.

Hai due tipi di dati. Uno è un numero in virgola mobile con 32 bit di precisione che è la base 3 (rappresentato dalle cifre 0, 1 e 2). L'altro è un numero in virgola mobile con 64 bit di precisione che è la base 4.

Dato questo codice:

float a = .3 + .6
float b = .9;

print(a == b)

Il confronto restituirà true se vengono utilizzati i float di base 3 e false se vengono usati i float di base 4, anche se il float di base 4 ha una precisione molto più elevata.

Perché è questo? Poiché i numeri 3, 6 e 9 possono essere rappresentati esattamente nel float di base 3, ma può essere solo approssimato nel float di base 4, indipendentemente dal numero di cifre di precisione ci sono.

Questo è il motivo per cui i numeri in virgola mobile non dovrebbero mai essere confrontati usando == . Devono sempre essere confrontati utilizzando un intervallo di errori consentiti.

    
risposta data 18.07.2013 - 23:25
fonte

Leggi altre domande sui tag