Quando i problemi di arrotondamento diventano un problema reale? La cifra meno significativa è una tantum davvero un grosso problema? [duplicare]

6

Se faccio .1 + .1 + .1 in Python, ottengo 0.30000000000000004 . (Non sto chiedendo di Python in particolare, e non voglio risposte specifiche di Python.)

L'unico problema che posso vedere con questo è 0.30000000000000004 != 0.3 , quindi ho bisogno di fare attenzione a come faccio a confrontare i float. Ci sono altri problemi di cui dovrei essere a conoscenza con l'arrotondamento mobile?

Non riesco a immaginare che l'ultima cifra sia un grosso problema nella vita reale. Ad esempio, se chiedo una "verga di metallo da 0,3000000000000004000 metri", non ho intenzione di lamentarmi che "questa canna è di 0,00000000000000004 metri troppo lunga!" (Posso solo tagliare l'extra, giusto?:)

Anche con un sacco di calcoli float in corso, non riesco a immaginare l'arrotondamento così lontano che conta. Mi sto perdendo qualcosa? Quando gli errori di arrotondamento in virgola mobile sono davvero importanti?

    
posta Buttons840 20.01.2014 - 23:06
fonte

3 risposte

14

Le variazioni nella "cifra meno significativa" possono causare l'arrotondamento dell'intero numero nella direzione sbagliata.

Prendiamo un oggetto che costa $ 0,705 - il mezzo centesimo è da sconto, tasse o qualcosa del genere, oppure questo è uno sconto del 10% su qualcosa che è $ 7,05. In ogni caso ... tre di loro e stiamo calcolando il prezzo (o lo sconto). Il prezzo totale è di $ 2,15 e devi arrotondare opportunamente a $ 2,12 (mezzo alto).

public class Round {
    public static void main(String[] args) {
        double item = 0.705;
        double subtotal = item * 3;
        System.out.println(subtotal);
        double rounded = Math.round(subtotal * 100.0)/100.0;
        System.out.println(rounded);

        subtotal = 2.115;   // what the subtotal *should* be
        rounded = Math.round(subtotal * 100.0)/100.0;
        System.out.println(rounded);
    }
}

Tuttavia, l'output di questo programma è:

2.1149999999999998
2.11
2.12

E lì, siamo fuori da un centesimo a causa di qualcosa che è accaduto nella cifra meno significativa di un calcolo in virgola mobile.

Avendo lavorato in precedenza sul codice del punto vendita che spaventosamente aveva i doppi sparsi attraverso di loro (ho passato mesi a convertirli in un sistema arbitrario a punto fisso). Sono sicuro di aver risolto quel problema, almeno in tutto il codice che stavo cercando a ...), posso assicurarti che sono un vero problema e che la cifra meno significativa che si trova in una posizione è un grosso problema.

In un primo momento, questo sarà un "oh, è solo un centesimo" ma in questo software, si tratta di soldi ... e la gente si sente molto permalosa per il fatto che i soldi siano spenti. Ci sono due parti: la fiducia che il cliente ha quando vede $0.705 * 3 = $2.11 quando sa che dovrebbe essere $2.12 . L'altra parte è che il denaro si accumula e nel corso di giorni o settimane o mesi, aggiunge importi potenzialmente considerevoli quando non viene calcolato correttamente. Questo accade spesso nei calcoli delle tasse (questo è un modo facile per ottenere frazioni scomode) e le agenzie che raccolgono le tasse sono molto meno simpatiche del cliente che è fuori da un centesimo ... e possono fare cose cattive come gli audit.

    
risposta data 21.01.2014 - 01:27
fonte
6

Quando hai a che fare con cose che sono misurate (velocità, distanza, peso, ecc.) l'arrotondamento è OK in quanto la precisione della misurazione originale è probabilmente inferiore alla precisione del tuo calcolo e, gli utenti accettano che il numero finale sia ancora una stima anche se è una buona stima.

Quando hai a che fare con errori di arrotondamento contati (denaro, persone, ICBM) è un disastro. C'è sempre una risposta aritmetica corretta e, spesso, l'accuratezza di questa risposta è sancita da regolamenti, trattati e leggi fiscali. Fornire un numero leggermente errato ti dà un biglietto gratuito nel mondo Kafkiano di auditor, esattori delle tasse e ispettori governativi; potresti mai scappare con te la sanità mentale intatta.

    
risposta data 21.01.2014 - 02:51
fonte
5

Even with a lot of float calculations going on, I can't imagine the rounding getting so far off that it matters. Am I missing something? When do floating point rounding errors really matter?

I maggiori problemi si presentano con addizione e sottrazione. Dati due numeri molto vicini l'uno all'altro in termini di grandezza, la differenza o la somma possono perdere la precisione (a volte molto), a seconda che abbiano segni identici o opposti. Dati due numeri molto distanti l'uno dall'altro in termini di grandezza, il termine più piccolo può svanire nel rumore di bit.

Ciò provoca scompiglio con le tecniche numeriche per risolvere problemi di valore iniziale (ovvero l'integrazione numerica). Usa una tecnica pessima come il metodo di Eulero e quegli errori di troncatura a doppia precisione significano che il meglio che puoi fare è un errore relativo di 10 -8 a 10 -6 - e questo è solo se l'intervallo di interesse è piccolo. Usa una tecnica molto buona e sei fortunato se vedi un errore relativo di 10 -14 a 10 -12 , e ancora una volta è solo se l'intervallo di interesse è piccolo. Propagare i pianeti per milioni di anni e tutte le scommesse sono spente, anche con le migliori tecniche. È necessario utilizzare la precisione quad per quegli intervalli di interesse molto lunghi.

    
risposta data 21.01.2014 - 01:00
fonte

Leggi altre domande sui tag