Strano risultato della divisione in C

Alcuni duplicati:
1.265 * 10000 = 126499.99999999999 ?????
Come viene memorizzato il punto mobile? Quando importa?
Strano comportamento a virgola mobile in un programma Java
Perché vedo una doppia variabile inizializzata su un valore come 21.499999618530273 come 21.499999618530273?
Errore nell’aggiunta di Flash

Divido 23 per 40 (23/40). In C questa operazione ha come risultato 0,5749999999999996. Ma in realtà deve essere 0,575!

Come posso risolvere questo?

Il problema è perché il valore .575 non ha una rappresentazione esatta nella codifica in virgola mobile. La correzione dipende da cosa devi fare con il valore e dall’impatto dell’imprecisione.

Se è solo un problema di visualizzazione, usa l’arrotondamento a 3 decimali e otterrai 0,575.

Se è a causa di inaccuratezza del calcolo, prova a mantenere il valore come frazione che sarà esatto. Dovrai memorizzare e gestire due valori in virgola mobile ma sarà esatto. Rinvia la divisione effettiva all’ultimo momento in cui hai bisogno del risultato.

Controlla se la differenza tra i due valori è rilevante per il tuo problema. Ad esempio, sottrarre sqrt epsilon al valore e verificare quanto il cambiamento influenza il risultato finale del calcolo e confrontarlo con la precisione richiesta o desiderata.

Sfortunatamente dobbiamo convivere con la limitazione della rappresentazione del valore reale in float. L’uso di virgolette di precisione a 128 bit renderà l’errore molto più piccolo ma non nullo.

Dai un’occhiata a questo – dovrebbe dirti tutto quello che c’è da sapere su Why Computers Suck At Math

Questo è un artefatto da come vengono memorizzati i numeri in virgola mobile.

O è ansible arrotondare la risposta sprintf (“%. 3f”, risultato) o utilizzare un pacchetto di gestione decimale.

Ti suggerisco di fare una ricerca sul web per “precisione in virgola mobile” o guardare le dozzine assolute di altre domande su SO di cui il tuo è un duplicato.

È normale con l’aritmetica in virgola mobile. Puoi cambiare il modo in cui i tuoi float e double s vengono stampati usando% .3g per esempio

Non puoi sistemarlo. Non tutti i numeri possono essere rappresentati come float, vedere “come viene memorizzato il floating point, quando è importante” .