2012-05-28 5 views
6

Stavo calcolando le proiezioni di punti 2D normalizzati e accidentalmente ho notato che erano più precisi di quando proiettavano i punti senza normalizzarli. Il mio codice è in C++ e compilo con NDK per un cellulare Android privo di FPU (unità a virgola mobile).Normalizzazione delle variabili in C++ tra (0,1) per ottenere accuratezza in aritmetica

Perché ottengo precisione nei calcoli con C++ quando prima normalizzo i valori in modo che siano compresi tra 0 e 1?

È generalmente vero in C++ che si ottiene precisione nell'aritmetica se si lavora con variabili che sono tra 0 e 1 o è correlato al caso di compilazione per un dispositivo ARM?

+5

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

+1

Quello che probabilmente stai vedendo sono più cifre a causa dell'incapacità dei valori in virgola mobile di essere precisi sui computer. –

+0

Allora forse vedo più precisione perché sto compilando per un dispositivo ARM che non ha FPU e sta convertendo in aritmetica a punto fisso? –

risposta

9

Hai un equivoco di precisione. La precisione è fondamentalmente il numero di bit disponibili per rappresentare la mantissa del tuo numero.

È possibile che sembriate avere più cifre dopo il punto decimale se si mantiene la scala tra 0 e 1 ma non è la precisione, che non cambia affatto in base alla scala o al segno.

Ad esempio, la precisione singola ha 23 bit di precisione indipendentemente dal fatto che il numero sia 0,5 o 1e38. La doppia precisione ha 52 bit di precisione.

Vedere this answer per ulteriori dettagli sulla rappresentazione a livello di bit IEEE754.

+0

ok, quindi non intendevo la precisione, ma la precisione sui calcoli –

+0

e quando parliamo di aritmetica a virgola fissa? In tal caso il numero massimo di bit necessari per rappresentare il numero intero massimo influisce sulla precisione? –

+1

Se si utilizza il punto fisso anziché il CEE IEEE754 standard in virgola mobile, si va benissimo fuori dallo scopo dello standard C++, nel qual caso il comportamento è una cosa specifica dell'implementazione. Ma anche il punto fisso (se scala bene) avrà lo stesso comportamento di precisione simile indipendentemente dalla scala. Se vedi una precisione diversa su scale diverse, dipende in realtà da come è stata implementata. – paxdiablo

3

Se si eseguono calcoli basati su matrice, è possibile calcolare i numeri di condizione delle matrici. In sostanza, il numero di condizione misura la dimensione dell'errore numerico nella risposta in funzione della dimensione dell'errore numerico nei propri input. Si dice che un problema con un numero di bassa condizione sia ben condizionato, mentre si dice che un problema con un numero di alta condizione sia mal condizionato.

Per alcuni problemi, è possibile pre-elaborare i dati (ad esempio riscalare le unità in cui si misurano determinate variabili) in modo che il numero di condizioni diventi più favorevole. Per esempio. un foglio di calcolo finanziario in cui alcune colonne sono misurate in centesimi di dollaro e altre in miliardi di dollari è mal condizionato.

Vedere Wikipedia per una spiegazione approfondita.

Problemi correlati