GuidePerché i convertitori a virgola mobile falliscono (e come la matematica decimale risolve il problema)
Perché i convertitori a virgola mobile falliscono (e come la matematica decimale risolve il problema)
Comprendi perché la virgola mobile binaria crea strani residui di conversione, quando questi errori contano e in che modo l'aritmetica decimale o razionale mantiene affidabili i convertitori di unità.
Il classico problema 0.1 + 0.2 soddisfa le unità
La maggior parte delle CPU memorizza numeri non interi in virgola mobile binaria (IEEE 754). Le frazioni che sembrano semplici in formato decimale (0,1, 0,001, 2,54) spesso non possono essere rappresentate esattamente in formato binario. Il valore memorizzato è l'approssimazione rappresentabile più vicina e l'aritmetica sulle approssimazioni accumula piccoli residui.
La conversione delle unità moltiplica e divide ripetutamente tali valori. Converti pollici in millimetri e ritorno, o litri in metri cubi e ritorno, e potresti vedere 2,9999999997 invece di 3. Il fattore di conversione fisico era esatto; la rappresentazione del computer non lo era.
Per molti display la differenza è invisibile dopo l'arrotondamento. Per il dosaggio adiacente al settore finanziario, i percorsi utensile CNC, l’area legale o le asserzioni di test automatizzati che prevedono l’uguaglianza esatta, questi residui diventano veri e propri bug.
Quali fattori di conversione sono esatti sulla carta
Il pollice internazionale misura esattamente 25,4 mm. Il piede internazionale è esattamente 0,3048 m. Il litro è esattamente 0,001 m³. Un centimetro cubo è esattamente 1 ml nel senso comune del laboratorio (1 cm³ = 10⁻⁶ m³). Queste sono definizioni, non misurazioni.
Se il software memorizza 25.4 come float binario, potrebbe essere già leggermente errato prima che venga eseguita qualsiasi conversione. Moltiplicando per un altro fattore inesatto si aggrava l'errore. I test di andata e ritorno che asseriscono una rigorosa uguaglianza poi falliscono anche quando l’algoritmo è concettualmente corretto.
La temperatura aggiunge offset: Celsius ↔ Kelvin utilizza 273,15. Quella costante è anche un valore decimale che il float binario è solo approssimativo. Le conversioni affini sono particolarmente sensibili perché l'aggiunta di un offset inesatto sposta ogni risultato.
Dove gli errori in virgola mobile si manifestano nella pratica
I convertitori dell'interfaccia utente spesso nascondono il problema arrotondando a un numero fisso di decimali. Gli utenti vedono risultati puliti e non notano mai il rumore interno. I problemi compaiono quando un altro sistema utilizza il float grezzo: un kernel CAD, un'esportazione CSV o un test unitario che confronta stringhe di massima precisione.
Le conversioni concatenate amplificano i problemi. Andare da miglio → iarda → piede → pollice → millimetro → metro con numeri binari in virgola mobile ad ogni passaggio è peggiore della conversione di un singolo miglio → metro con un fattore di alta precisione. Ogni hop arrotonda nuovamente il valore intermedio.
Le quantità al quadrato e al cubo peggiorano gli errori. Area e volume moltiplicano le scale di lunghezza, quindi un piccolo errore relativo nella lunghezza diventa due o tre volte più grande in termini relativi per l'area o il volume quando si espande (1+ε)ⁿ.
Alternative decimali, razionali e di virgola fissa
Le librerie decimali (ad esempio decimal.js, Big.js o decimali nativi della lingua) memorizzano i numeri in base 10. I fattori decimali esatti come 0,3048 e 0,001 rimangono esatti entro la precisione scelta. I convertitori di unità che hanno a cuore la correttezza spesso convertono tramite un'unità di base decimale.
L’aritmetica razionale memorizza i fattori come frazioni di numeri interi. Se 1 pollice = 127/5000 metri esattamente (perché 25,4 mm = 127/5000 m), la moltiplicazione può annullarsi esattamente. I razionali sono ideali per conversioni su scala pura; gli offset necessitano ancora di un'attenta gestione della temperatura.
La matematica a virgola fissa ridimensiona tutto fino al conteggio intero del più piccolo tick: nanometri, microlitri o millesimi di pollice. L'aritmetica dei numeri interi è esatta finché non si eccede. Funziona bene per i domini con un chiaro quanto di misurazione.
Regole pratiche per convertitori affidabili
Memorizza i fattori legali esatti come decimali o razionali, non come numeri in virgola mobile digitati frettolosamente. Converti input → base → output nel minor numero di passaggi possibile. Arrotonda solo durante la formattazione per gli utenti umani e documenta la modalità di arrotondamento.
Non testare mai i convertitori con rigorosa uguaglianza su float binario. Confronta entro una tolleranza assoluta o relativa oppure confronta forme di stringhe decimali con una precisione dichiarata. Preferisci i test dorati che utilizzano coppie esatte note come 1 pollice = 25,4 mm.
Se crei l'interfaccia utente di una calcolatrice, mostra una precisione sufficiente per essere utile, ma non così tante cifre da far sembrare il rumore mobile un segnale. Uno strumento di lunghezza che mostra dodici decimali dopo la conversione tramite float pubblicizza il suo errore di rappresentazione.
Quando i float binari vanno ancora bene
Confronti approssimativi, giochi, visualizzazione dei dati e molte simulazioni scientifiche tollerano l'errore float perché l'incertezza del modello sminuisce l'errore di rappresentazione. La chiave è conoscere la tua tolleranza. Se un millimetro conta, i galleggianti necessitano di disciplina o sostituzione.
L'accelerazione hardware e le pipeline GPU spesso impongono il float. In questi casi, mantieni la conversione autorevole in decimale sulla CPU o sul server e tratta i float della GPU come una visualizzazione o un'approssimazione intermedia.
Una buona ingegneria è abbinare la rappresentazione numerica alla decisione che prenderai con il numero. La conversione delle unità per l'industria manifatturiera, la medicina e la metrologia legale merita la matematica decimale o razionale; un widget meteo che converte le temperature della città no. In caso di dubbio, scegli la rappresentazione più rigorosa: il costo in termini di prestazioni dei decimali è solitamente inferiore al costo di un bug di andata e ritorno silenzioso.
Convertitori correlati
Domande frequenti
Perché la conversione avanti e indietro cambia il mio numero?
La virgola mobile binaria non può rappresentare esattamente molti fattori decimali. Ogni moltiplicazione o divisione aggiunge un piccolo errore di arrotondamento. La conversione di andata e ritorno tramite float spesso non riesce a ripristinare i bit originali anche quando i fattori di conversione sono concettualmente esatti.
La doppia precisione è sufficiente per la conversione delle unità?
La doppia precisione (float64) è sufficiente per molte conversioni quotidiane dopo l'arrotondamento della visualizzazione, ma non sostituisce i fattori decimali esatti quando sono necessari viaggi di andata e ritorno bit-stabili, metrologia legale o severi test automatizzati. Preferire i decimali o i numeri razionali per i convertitori autorevoli.
Come dovrei confrontare i risultati del convertitore nei test?
Confronta con una precisione dichiarata, utilizza l'uguaglianza delle stringhe decimali o afferma tolleranze assolute e relative. Evitare di aspettarsi un'uguaglianza binaria esatta dopo diversi passaggi aritmetici.