2010-06-23 21 views
13

Quali sono alcuni buoni do-do e don -t-s per l'aritmetica in virgola mobile (IEEE754 in caso di confusione) per garantire una buona stabilità numerica e un'elevata precisione nei risultati?Do-s e Don't-s per l'aritmetica in virgola mobile?

So che alcuni non sottovalutano quantità di grandezza simile, ma sono curioso di sapere quali altre buone regole sono disponibili.

+3

Ci sono molte domande su SO che trattano già questo. Hai fatto una ricerca e non hai trovato nessuno che risponda a questo? – ChrisF

+1

Utilizza le macro di confronto (C99 std: 7.12.14 Macro di confronto) invece di operatori come ==,> =, ecc. –

+6

La natura cumulativa delle "risposte" a questa domanda sembra renderla un candidato privilegiato per Wiki di comunità. – corsiKa

risposta

12

In primo luogo, immettere la nozione che i numeri in virgola mobile fanno NON necessariamente seguono le stesse regole dei numeri reali ... una volta accettato questo, capirete la maggior parte delle insidie.

Ecco alcune regole/consigli che ho sempre seguito:

  • mai paragonare un numero in virgola mobile a zero o qualsiasi altra cosa per quella materia (IE non lo facciamo: if (myFloat == 0)
  • proprietà associativa fa non tenere premuto per virgola mobile ...il che significa (a + b) + c != a + (b + c)
  • ricordare che c'è sempre arrotondamento
  • numeri a virgola mobile non hanno necessariamente un unico inverso
  • Senza chiusura con numeri in virgola mobile ... Mai dare per scontato che il risultato di un galleggiante risultati dell'operazione punto in una valida numero in virgola mobile.
  • proprietà distributiva non regge
  • Cercare di evitare l'uso di paragoni in virgola mobile a tutti ... come errore completano può causare risultati imprevisti
+1

"non presupporre mai che il risultato di un'operazione in virgola mobile abbia come risultato un numero in virgola mobile valido." Sarà sempre un altro numero a virgola mobile, a meno che non intenda NAN o infinito? –

+0

Giusto mi dispiace, dovrei chiarire ... Un'operazione in virgola mobile potrebbe non dare come risultato un numero reale :) – Polaris878

0

mai cercare di fare un confronto eguali

doppia da, db;

...

se (da == db) poi qualcosa.

ricordare che C utilizza doppio di default, quindi se si vuole fare singola precisione, essere chiari su di esso

galleggiante FA, FB;

...

fa = fb + 1,0;

convertirà fb di raddoppiare fare un doppio add poi convertire in singolo e fare un unico uguale

Invece

fa = fb + 1.0F.

tutto singolo.

Se si intende utilizzare un numero intero come 1.0 non renderlo un numero decimale nel codice. ottieni più affidabilità dai tuoi compilatori/strumenti se puoi minimizzare i numeri ascii. so

fa = fb + 1;

o al posto di

fa = fb + 0.3333333F;

fare qualcosa del genere (se interessato alla precisione).

fc = 1; fc = fc/3; fa = fb + fc;

Un sacco di altre cose, il punto in virgola mobile è doloroso, i compilatori e le librerie non sono così buone, fpus hanno bug e IEEE è eccezionalmente doloroso e porta a più bug. Sfortunatamente questo è il mondo in cui viviamo sulla maggior parte delle piattaforme.

5

il # 1 "non" regola con virgola mobile i numeri sono:

Non utilizzare numeri a virgola mobile dove gli interi sono sufficienti.

-1

cercare, scaricare e leggere "ciò che ogni scienziato informatico dovrebbe conoscere aritmetica in virgola mobile"

+4

-1 per non collegarlo o essere utile – Malfist

+0

phweem: http://docs.sun.com/source/806-3568 /ncg_goldberg.html? – naiad

+0

Sì, ma non ero sicuro se ce n'era uno "ufficiale" da qualche parte. – dmuir

5

capisco come si comportano in virgola mobile.

NON credere che le regole semplici saranno sufficienti per utilizzarle correttamente.

Ad esempio, almeno due risposte hanno proposto di confrontare il punto in virgola mobile per l'uguaglianza. In primo luogo ci sono casi in cui confrontarli per l'uguaglianza è ciò che è necessario. Quindi, quando si esegue il controllo dell'intervallo, è necessario essere consapevoli del fatto che ha il suo trabocchetto, ad esempio non è transitivo, è una proprietà che la maggior parte delle persone supporrà per il test di uguaglianza.

+0

+1. Ci sono troppe risposte dogmatiche "mai confrontare carri armati per l'uguaglianza" in giro. –

3

Ricordare che a causa di errori aritmetici in virgola mobile people died e miliardi di dollari di damages si è verificato.

0

La mia "arma principale" per evitare trabocchetti in virgola mobile è avere una solida comprensione del modo in cui lavorano. Penso che lo Chris Hecker spieghi abbastanza bene le basi.