JAVA usa una rappresentazione in VIRGOLA MOBILE TIPI DI DATI, 2a Parte Numeri Reali 2 tipi : - float (32 bit) - double (64 bit) La struttura di un numero reale (float o double) è data da 3 parti: - segno - mantissa - esponente JAVA usa una rappresentazione in VIRGOLA MOBILE standard definita nel documento IEEE754
IN GENERALE 8 4 5 2 4 2 3 mantissa - 8 4 5 2 , 4 2 3 Posizione della virgola SEGNO - 4 cifre nella parte intera - 3 cifre nella parte frazionaria esponente QUINDI : - 8452,423 = - 8452423 X 10-3 (-, 8452423, -3) (-, 8452423, 4) = - 0,8452423 X 104
In specifico IEEE 754 si lavora in binario; introduciamo il concetto di BIAS; per determinare l'esponente spostiamo la virgola dopo la cifra più significativa, che è sempre un 1, quindi non ho bisogno di rappresentare !!! Il bit prima della cifra più significativa è riservato al segno;
Quanti bit per parte ? Float Double
Esempio: -75 → sommo il bias → 52 Come sono memorizzati i numeri ? Premessa, parliamo del BIAS Segno Esponente + bias Mantissa BIAS: Per FLOAT: 127 ( = 128-1 = 27-1) Per DOUBLE: 1023 ( = 1024-1 = 210-1) Valori massimi rappresentabili con 7 e 10 bit Per comodità uso i numeri decimali, ma la rappresentazione della macchina rimane binaria SCOPO: Il BIAS permette di rappresentare ESPONENTI NEGATIVI con VALORI POSITIVI In altre parole traslo l'intervallo in cui è definito l'esponente: Esempio: -75 → sommo il bias → 52 -126 0 +127 1 127 255
Quindi il IEEE754 i numeri reali sono memorizzati . . . SEGNO NEGATIVO MANTISSA 1 10000101 11011010100000000000000 ESPONENTE + BIAS ESPONENTE: 10000101 – BIAS = 110 - 1,11011010100000000000000 x 2 110 questo 1 non era rappresentato
L'esponente assume il valore di tutti i bit a 0 solo per rappresentare 0,0 a condizione che anche segno e mantissa siano a 0: Segno: + Mantissa: 0 Esponente: -127
+ somma - sottrazione * moltiplicazione / divisione Operatori aritmetici: + somma - sottrazione * moltiplicazione / divisione N.B.: non c'è l'operazione di modulo
Conversioni implicite byte → short, int, long, float, double Conversione tra interi e interi, tra interi e reali e tra reali e reali: Conversioni implicite byte → short, int, long, float, double short → int, long, float, double int → long, float, double long → float, double float → double . . . Int a; Long b; b=a;
Conversioni esplicite . . . long A; int B; A = 5483; B = (int)A; Conversioni esplicite (pericolose – si possono ottenere risultati indesiderati) int → byte, short short → byte long → byte, short, int float → byte, short, int, long, char Double → byte, short, int, long, char, float CAST !!