Skip to content

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:

  1. float: (Tipicamente a 32-bit). Preciso fino a circa 7 cifre decimali.
  2. double: (Tipicamente a 64-bit). Preciso fino a circa 15 cifre decimali.
  3. long double: Per precisioni estese (es. 80-bit o 128-bit).

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 // double
10.0f // float (il suffisso f è molto comune)
1.5e-3 // Notazione scientifica (0.0015)

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 per 0.0.
  • Not a Number (NAN): Se esegui operazioni matematicamente non valide o indefinite, ad esempio 0.0 / 0.0 o la radice quadrata di un numero negativo. Se NaN è coinvolto in un calcolo aritmetico, propaga NaN nel 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).

Verifichiamo la perdita di precisione. Sommiamo 0.1 e 0.2 e vediamo se il risultato è esattamente 0.3.