Spiegare la precisione in virgola mobile ai clienti [chiuso]


23

Qual è il modo migliore per spiegare ai clienti il problema dell'arrotondamento in virgola mobile ?

lo so

http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

così come le voci nelle FAQ del C ++ e varie altre pagine rivolte a sviluppatori e scienziati, ma esiste una pagina web, un articolo o una spiegazione, rivolta a clienti "regolari" con un background matematico o scientifico limitato? (per il quale i riferimenti sopra riportati risultano piatti).

Se fosse gestito o proveniente da un'istituzione o società ben nota e riconosciuta, tanto meglio, dato che, come alcuni di voi potrebbero aver sperimentato, può essere un po 'complicato spiegarlo da soli.


1
Non mi preoccuperei ...
John Shaft,

1
Questa è una domanda davvero fantastica, +10 se potessi. Un problema frequente per gli sviluppatori.
Cody Gray,

2
Non è un problema di dettaglio, sta rispondendo a fi perché aggiungere ciò che osserva i numeri di precisione a 2 cifre decimali, si finisce con un 5.9999999 e non un 6, e perché è necessario specificare la precisione di arrotondamento quando è "ovvio" il risultato non dovrebbe ' non hanno più di due cifre decimali. O perché a volte 2 meno 2 non è sempre zero, e non assomigliare a uno stupido scemo mentre lo fa.
Eric Grange,

9
@Eric Grange: se i tuoi clienti considerano questi problemi di precisione come un bug, allora è un bug e devi trovare un modo per risolverlo (forse non usando float). A loro non importa da dove provenga questo problema di precisione. A loro non importa come funziona il tuo software. Vogliono solo che funzioni.
David,

3
@Eric: l'uso del virgola mobile è un dettaglio di implementazione. Ripeto la mia domanda, che non chiede qualcosa spiegato nella domanda, e che evidentemente non ho chiarito (scuse): qual è il contesto e perché stai discutendo l'uso del virgola mobile con un cliente?
Tom Anderson,

Risposte:


8

Trovo un modo semplice per spiegare questo è dimostrarlo . Discutere su come dividere xper un numero, quindi moltiplicarlo per lo stesso numero, dovrebbe farti tornare di xnuovo - convincere il cliente a concordare sul fatto che dovrebbe sempre essere così. Quindi fai il vecchio (100 / 3) * 3su una calcolatrice; mostra che il valore non, come ci si aspetterebbe, ritorna a 100. Quando la maggior parte delle persone vede la matematica "apparentemente semplice" rompersi, quindi tende a "prendere" il pericolo di numeri in virgola mobile dove l'accuratezza è importante (anche se in modo intuitivo piuttosto che a basso livello l'articolo in cui punti).

Sfortunatamente la maggior parte dei calcolatori decenti (sicuramente tutti quelli scientifici che ho visto, e più di alcuni di base) al giorno d'oggi sono in grado di gestirlo - presumo che stiano memorizzando cifre extra oltre a ciò che può essere visualizzato e arrotondato - così fanno controlla quanto è intelligente la tua calcolatrice prima di farlo davanti al tuo cliente.


1
Sì, quasi tutti i calcolatori stanno memorizzando almeno 2 cifre extra, quindi devi aggiungere alcune moltiplicazioni nel mix, il che confonde la spiegazione e l'IME li fa pensare che stai cercando di ingannarli. La radice quadrata richiede meno operazioni, ma la radice quadrata è già al di fuori del regno quotidiano dei clienti regolari.
Eric Grange,

2
@Scott Ho provato alcuni calcolatori qui, nessuno ha riscontrato problemi con (100/3) * 3, anche (100/3) * 3-100 non ha mostrato problemi ... Anche Excel ha funzionato.
Eric Grange,

9
Prendi i soldi come esempio, che ha una precisione limitata perfetta. Spiega che dividi un dollaro, quindi ogni persona ottiene 33 centesimi e un centesimo viene perso per arrotondamento. Chiunque può riferirsi a quello.
Inca,

4
Non preoccuparti della calcolatrice. Dividi 1 per 3 su carta, mantenendo tre cifre significative.
David Thornley,

5
@omegacentauri se pensi che questa spiegazione sia d'aiuto, immagino che non parli spesso con i clienti.
jhocking

5

Non credo ci siano scorciatoie. Devi:

  • Comprendi cos'è il virgola mobile e come si comporta.

Oppure, se è troppo richiesto, devi solo:

  • Accetta che il computer non ti darà risultati numerici esatti.

Forse un esempio con i numeri irrazionali aiuta (anche se le questioni in virgola mobile si applicano ai numeri razionali pure): sqrt(2) ~ 1.414. Poi 1.414^2 = 1.999396. Non importa quante cifre prendi, non tornerai mai indietro all'originale 2. Ok, 4 cifre significative corrette possono essere accettabili, ma poi considera cosa succede quando si accumula questo tipo di "errori di arrotondamento". Ecco dove si trova il vero pericolo.


2
Personalmente lo so e capisco, ma per alcune persone "virgola mobile" è già un termine alieno, quindi hai bisogno di più di una spiegazione matematica o scientifica per spiegare che ciò che possono calcolare nella loro testa, i loro costosi computer e software hanno difficoltà a ottenere il giusto ;) Anche la radice quadrata è al di fuori del regno quotidiano dei clienti abituali.
Eric Grange,

5

Innanzitutto, determina di cosa si stanno lamentando. Le transazioni finanziarie devono essere eseguite con precisione, con il giusto numero di cifre decimali e le giuste regole di arrotondamento. Questo in genere significa mantenere numeri interi di unità monetarie e assicurarsi che l'aritmetica sia corretta.

In alternativa, potrebbero lamentarsi dei display con sovraesposizione e ridurre il numero di cifre significative può essere tutto ciò che è necessario.

Per i numeri in generale, puoi sempre provare a trovare un decimale di tre cifre x tale che x * 3 sia 10. Ciò mostra i principi di base.

Ci sono due problemi rimanenti. Uno è che alcuni numeri possono essere espressi esattamente in decimali ma non binari (3.15, diciamo). Sarà difficile da spiegare a persone non tecniche, e la tua scommessa migliore è cercare di evitarlo non fornendo cifre abbastanza significative da mostrare. L'altro è il cliente che ne sa un po ', abbastanza per sapere che l'aritmetica del computer non è sempre esatta e non abbastanza per rendersi conto che l'aritmetica decimale non è sempre esatta. Ho discusso con alcuni di questi e non ho nulla di utile da segnalare.


3

I numeri in virgola mobile nei computer usano binario, quindi proprio come abbiamo un sistema numerico con un, decine, centinaia e decimi, colonne centesimi, i numeri in virgola mobile nei computer in realtà hanno un, due, quattro e metà, quarti e ottave colonne. Se il cliente ha familiarità con i piedi / pollici, ricorda loro come in genere usi le frazioni base-2 di pollice per la misurazione.

Ora prova a conservare 10 centesimi come una combinazione di metà, quarti, ottavi di dollaro. Semplicemente non funziona:

.00011001100110011. . . (si ripete all'infinito )

È lo stesso di prendere un nastro di misurazione imperiale standard e provare a misurare un decimo di pollice. Non puoi farlo con precisione. Non c'è rappresentazione di 1/10 come X / Y dove X e Y sono numeri interi e Y è una potenza di 2.

Ecco perché abbiamo i tipi di dati decimali che utilizzano 4 bit per memorizzare ogni cifra decimale , quindi torniamo alla rappresentazione di base 10. Il compromesso è nello spazio e nelle prestazioni (circa un successo delle prestazioni del 100%, da quello che ho letto).


1

Dì loro che proprio come il loro conto bancario non può contenere 4.4423425908459032890413 ... dollari (sono $ 4,44 o $ 4,45, niente in mezzo), il computer non può facilmente memorizzare un numero con precisione arbitraria. Le imperfezioni della conservazione portano a imperfezioni dei calcoli.

(È un po 'barare, ma dovrebbe dare loro un'idea di quale sia il problema.)


2
Purtroppo, questa spiegazione non funziona, poiché il problema della precisione può verificarsi quando si sommano numeri che hanno tutti solo due cifre di precisione.
Eric Grange,

1
Due cifre decimali . Sì, sono d'accordo, un cliente curioso individuerà dei buchi. Ma poi puoi colpirli con la discussione sulla rappresentazione binaria - te lo hanno chiesto ;-)
quant_dev

Bene, già cercando di spiegare il punto fluttuante, l'IME inizia immediatamente a pensare che stai cercando di rovinarli, il che è qualcosa che potrebbe essere alleviato se arrivasse in termini semplici e comprensibili o da un'istituzione o società ben nota. :)
Eric Grange,

1
@Eric Math è difficile, andiamo a giocare a baseball: P
quant_dev,

1
Chiedi se è più preciso misurare qualcosa al millimetro più vicino o al millimetro più vicino. Quest'ultimo è più preciso, ma gli oggetti che sono un multiplo preciso di 0,1 "non saranno un multiplo preciso di 1 mm a meno che non siano anche un multiplo preciso di 5 "(precisamente 127mm). L'aggiunta della dimensione di due oggetti da 2,54mm misurati allo 0,1" più vicino produrrà una dimensione combinata di 0,2 "; sommando le dimensioni arrotondate al millimetro più vicino si otterrà 6mm anche se il la dimensione effettiva dovrebbe essere 5.08mm.
supercat

1

2/3

Chiedi loro di scrivere la risposta esatta a due divisi per 3.
Dato che la risposta "va avanti per sempre", puoi indicarlo.

Anche l'uso di 1/3 funzionerebbe, ma 2/3 è forse un esempio leggermente migliore in quanto l'arrotondamento ti dà (ad esempio) .6666667 mentre .3333333 sembra che possa essere semplicemente troncato.


0

Quando eseguono calcoli i computer di solito usano approssimazioni ai numeri (come invece di usare 1000000.7 usano 1000000) perché usare approssimazioni è molto più veloce. Il problema è che quando si eseguono calcoli con approssimazioni si ottengono indietro approssimazioni. Di solito funziona abbastanza bene, ma a volte porta a risultati inaspettati.


Non capisco davvero cosa stai dicendo qui. "Perché usare approssimazioni è molto più veloce"? A volte l'aritmetica dei numeri interi è almeno altrettanto veloce, e questo è preciso. A volte non c'è alternativa (come nella stampa della radice quadrata di 2).
David Thornley,

Bene, provi a spiegare a un ragazzo del marketing perché i computer non possono effettivamente rappresentare numeri irrazionali o praticamente qualsiasi numero nel grande schema delle cose (oh e quindi potresti voler dargli una breve lezione sull'irrazionalità di \ pi: qualcosa su Le serie di Fourier potrebbero essere carine). Approssimativo è una parola che le persone possono capire. Ti stai avvicinando dal punto di vista di qualcuno che sa che tutti i numeri non sono uguali.

0

Alcuni calcoli vengono eseguiti in base ad alcune regole legali. Ad esempio, se si desidera calcolare la quantità di imposta sul reddito che deve essere pagata su un reddito annuo imponibile di € 79.245,18 in Germania, esiste solo una risposta corretta. Hai capito bene o hai sbagliato. Se hai capito bene, non è necessario spiegare come funziona l'aritmetica in virgola mobile. Se si sbaglia, non è necessario spiegare come funziona l'aritmetica in virgola mobile, è necessario correggere il codice non funzionante.

A volte visualizzi risultati che non sembrano corretti. Ad esempio, se si convertono 13.297,46 USD in £ UK con due cifre decimali, quindi si converte tale importo di £ UK in USD, è possibile che non si ottengano 13.297,46 USD ma 13.297,45 USD o 13.297,47 USD. Ciò non ha nulla a che fare con l'aritmetica in virgola mobile. È un problema inevitabile e faresti meglio a spiegare perché è inevitabile. (Dovresti anche sapere perché il problema non si verifica quando converti da £ UK a $ US e viceversa).

Ci sono altri possibili risultati che non sembrano giusti. Se converti i numeri in percentuali, le percentuali dovrebbero aggiungere fino al 100%, ma potrebbero non esserlo. Se si visualizzano quattro percentuali con due decimali, le quattro percentuali visualizzate potrebbero aggiungere fino al 99,99% o al 100,01%. Niente a che vedere con l'aritmetica in virgola mobile. Tuttavia dovresti essere in grado di spiegare il perché.

Successivamente, ci sono situazioni in cui l'uso incurante dell'aritmetica in virgola mobile porta a risultati inappropriati. Ad esempio, a + b + c non è generalmente uguale a b + c + a. Se ciò causa un problema, non c'è nulla da spiegare, è qualcosa che risolvi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.