Qual è la differenza tra il tipo di dati float e integer quando la dimensione è la stessa?

Qual è la differenza tra il tipo di dati float e intero quando la dimensione è uguale?

  • float memorizza i valori in virgola mobile, ovvero i valori con potenziali cifre decimali
  • int memorizza solo valori interi, cioè numeri interi

Quindi, mentre entrambi sono larghi 32 bit, il loro uso (e rappresentazione) è molto diverso. Non è ansible memorizzare 3.141 in un numero intero, ma è ansible farlo in float .

Sezionandoli entrambi un po ‘oltre:

In un numero intero, tutti i bit vengono utilizzati per memorizzare il valore numerico. Questo è (anche in Java e molti computer) fatto nel cosiddetto complemento a due . Ciò significa che è ansible rappresentare i valori di -2 31 a 2 31 – 1.

In un float questi 32 bit sono divisi in tre parti distinte: il bit del segno, l’esponente e la mantissa. Sono disposti come segue:

 S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM 

Esiste un singolo bit che determina se il numero è negativo o non negativo (lo zero non è né positivo né negativo, ma il bit del segno è impostato su zero). Poi ci sono otto bit di un esponente e 23 bit di mantissa. Per ottenere un numero utile da questo, (approssimativamente) viene eseguito il seguente calcolo:

M × 2 E

(C’è dell’altro, ma questo dovrebbe essere sufficiente per lo scopo di questa discussione)

In pratica la mantissa non è molto più di un numero intero a 24 bit. Questo viene moltiplicato per 2 alla potenza della parte esponente, che, grosso modo, è un numero compreso tra -128 e 127.

Pertanto è ansible rappresentare con precisione tutti i numeri che rientrerebbero in un numero intero a 24 bit, ma l’intervallo numerico è anche molto maggiore in quanto gli esponenti più grandi consentono valori più grandi. Ad esempio, il valore massimo per un float è intorno a 3,4 × 10 38 mentre int consente solo valori fino a 2,1 × 10 9 .

Ma ciò significa anche, dal momento che 32 bit hanno solo 4,2 × 10 9 stati diversi (che sono tutti usati per rappresentare i valori int possono memorizzare), che all’estremità più ampia dell’intervallo numerico di float i numeri sono distanziati più largamente (poiché lì non possono essere più numeri float univoci rispetto ai numeri int univoci). Non puoi rappresentare esattamente alcuni numeri, allora. Ad esempio, il numero 2 × 10 12 ha una rappresentazione in float di 1,999,999,991,808. Potrebbe essere vicino a 2.000.000.000.000 ma non è esatto. Allo stesso modo, aggiungere 1 a quel numero non lo cambia perché 1 è troppo piccolo per fare la differenza nelle scale più grandi che float sta usando lì.

Allo stesso modo, puoi anche rappresentare numeri molto piccoli (tra 0 e 1) in un float ma indipendentemente dal fatto che i numeri siano molto grandi o molto piccoli, float ha solo una precisione di circa 6 o 7 cifre decimali. Se si dispone di numeri grandi, tali cifre sono all’inizio del numero (ad esempio 4.51534 × 10 35 , che non è altro che 451534 seguito da 30 zeri – e float non può dire nulla di utile sul fatto che quelle 30 cifre siano effettivamente zero o qualcos’altro) , per numeri molto piccoli (es. 3,14159 × 10 -27 ) si trovano all’estremità del numero, ben oltre le cifre iniziali di 0,0000 …

I float vengono utilizzati per memorizzare un intervallo di numeri più ampio di quello che può essere inserito in un numero intero. Questi includono numeri decimali e numeri di stile di notazione scientifica che possono essere valori maggiori di quelli che possono essere contenuti in 32 bit. Ecco la profonda immersione in loro: http://en.wikipedia.org/wiki/Floating_point