Numeri in Virgola Mobile (Floating-Point)
Per rappresentare i numeri reali (es. 3.14), i computer utilizzano i tipi a virgola mobile. Questa tecnica memorizza i numeri usando la notazione scientifica convertita in binario: una parte per il segno, una per l’esponente e una per il significando (o mantissa).
1 bit] --- E[Esponente
8 bits] --- M[Mantissa / Significando
23 bits]
end
style S fill:#ff9999,stroke:#333 style E fill:#99ff99,stroke:#333 style M fill:#9999ff,stroke:#333 `} />
In C ci sono tre tipi principali:
float: (Tipicamente a 32-bit). Preciso fino a circa 7 cifre decimali.double: (Tipicamente a 64-bit). Preciso fino a circa 15 cifre decimali.long double: Per precisioni estese (es. 80-bit o 128-bit).
Costanti Floating-Point
Section titled “Costanti Floating-Point”Quando scrivi un numero con la virgola (il punto in C), il compilatore lo considera di default un double.
Se vuoi forzarne il tipo, usa i suffissi:
10.0 // double10.0f // float (il suffisso f è molto comune)1.5e-3 // Notazione scientifica (0.0015)Problemi della Virgola Mobile
Section titled “Problemi della Virgola Mobile”Valori Speciali: Infinity e NaN
Section titled “Valori Speciali: Infinity e NaN”Diversamente dagli interi che vanno in overflow o wraparound, lo standard IEEE 754 (il motore dei float) gestisce i numeri estremi introducendo valori speciali (disponibili in <math.h>):
- Infinito (
INFINITY): Se un’operazione supera il massimo rappresentabile, o se dividi un numero positivo per0.0. - Not a Number (
NAN): Se esegui operazioni matematicamente non valide o indefinite, ad esempio0.0 / 0.0o la radice quadrata di un numero negativo. SeNaNè coinvolto in un calcolo aritmetico, propagaNaNnel risultato finale.
Puoi usare la macro fpclassify(x) per scoprire la classe di un numero float a runtime (es. se è un numero Normale, Infinito, o Zero).
💻 Esercizio Pratico
Section titled “💻 Esercizio Pratico”Verifichiamo la perdita di precisione. Sommiamo 0.1 e 0.2 e vediamo se il risultato è esattamente 0.3.