In Java, ho eseguito questo metodo:
private static void floatAddition() {
float a = 0.1F, b = 0.2F, c = a+b;
System.out.println(a + " + " + b + " = " + c);
}
e il risultato è 0.3
per floatAddition. Ora sto cercando di capire perché sta aggiungendo un risultato rotondo, e non a qualcosa di leggermente fuori a causa di punti fluttuanti.
Ho trasformato manualmente 0.1
e 0.2
in un sistema binario a 32 bit con standard IEEE 754, questo è ciò che ho ottenuto:
0.1 (decimal) = 0 01111011 10011001100110011001101 (binary)
0.2 (decimal) = 0 01111100 10011001100110011001101 (binary)
Ora aggiungo questi due insieme. Dal momento che gli esponenti sono diversi, devo portarli entrambi a uno più grande (2 ^ -3) quindi sto denormalizzando 0.1.
0.1 (decimal) = 0.11001100110011001100111 * 2-3 (binary) 0.2 (decimal) = 1.10011001100110011001101 * 2-3 (binary)
Questo è il risultato dell'aggiunta manuale:
0.1 (decimal) + 0.2 (decimal) = 10.01100110011001100110100 * 2-3 (binary)
Nello standard IEEE 754, questo sarebbe
0 01111101 00110011001100110011010
Ora per verificare se sono corretto, ho utilizzato questo convertitore IEEE 754: link Secondo questo sito, il mio risultato dovrebbe essere stato 0.30000001192092896.
Perché il calcolo del punto mobile è più preciso di quanto dovrebbe essere?