2014-09-25 10 views
10

Questi due numeri lunghi sono gli stessi tranne l'ultima cifra.Come arrestare matlab truncando i numeri lunghi

test = []; test(1) = 33777100285870080; test(2) = 33777100285870082;

ma l'ultima cifra si perde quando i numeri sono messi nella matrice:

unique(test) 

ans = 3.3777e+16 

Come posso evitare questo? I numeri sono codici identificativi e perdere l'ultima cifra sta avvitando tutto.

+2

sono * solo usati come codici ID * e * non c'è nessuna operazione aritmetica * eseguita su di essi? se così memorizzare come una stringa potrebbe essere un'opzione migliore ... – RTL

+0

Ho provato ma ottengo un problema simile, num2str taglia l'ultima cifra. – Lefti

+3

Digitando '' eps (test (1)) '' restituisce '' 4''. Questo significa che il prossimo numero più grande distinguibile da '' test (1) '' è '' test (1) + 4''. Puoi verificare con '' length (unique ([test, test (1) +4])) '' return '' 2''. Credo che non si possa risolvere questo problema con l'uso di numeri predefiniti, ma piuttosto di leggere (o inserire) l'id come stringhe. – Nras

risposta

13

Matlab utilizza la rappresentazione a virgola mobile a 64 bit per impostazione predefinita per i numeri. Quelli hanno una precisione in base 10 a 16 cifre (più o meno) e i tuoi numeri sembrano eccedere quello.

usare qualcosa come uint64 per memorizzare i numeri:

> test = [uint64(33777100285870080); uint64(33777100285870082)]; 
> disp(test(1)); 
    33777100285870080 
> disp(test(2)); 
    33777100285870082 

Questo è davvero un errore di arrotondamento, non un errore di visualizzazione. Per ottenere le stringhe corrette ai fini dell'output, utilizzare int2str, perché, di nuovo, num2str utilizza una rappresentazione a virgola mobile a 64 bit e in questo caso presenta errori di arrotondamento.

+0

L'esecuzione di '' num2str (test) '' con l'input dell'unità64 restituisce le stringhe desiderate. – Nras

+0

Volevo solo dire che non è davvero un errore di arrotondamento * di per sé *, è un limite intrinseco della rappresentazione in virgola mobile. Lo standard in virgola mobile non può rappresentare una differenza così piccola tra due numeri di quella magnitudine. –

+0

Grazie a uint64 era quello di cui avevo bisogno. – Lefti

Problemi correlati