2014-09-25 10 views
10

Diese beiden langen Zahlen sind die gleichen mit Ausnahme der letzten Ziffer.Wie stoppe Matlab abgeschnitten lange Zahlen

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

aber die letzte Ziffer verloren geht, wenn die Zahlen im Array gesetzt werden:

unique(test) 

ans = 3.3777e+16 

Wie kann ich das verhindern? Die Zahlen sind ID-Codes, und wenn man die letzte Ziffer verliert, wird alles verschraubt.

+2

werden sie * nur als ID-Codes verwendet * und * gibt es keine arithmetische Operation * auf ihnen? wenn das so als String speichern könnte eine bessere Option sein ... – RTL

+0

Ich habe versucht, aber ich bekomme ein ähnliches Problem, num2str schneidet die letzte Ziffer ab. – Lefti

+3

Eingabe von '' eps (test (1)) '' gibt '' 4'' zurück. Dies bedeutet, dass die nächst größere unterscheidbare Zahl von "test (1)" "test (1) + 4" ist. Sie können nach '' length (unique ([test, test (1) +4])) '' '' '' zurückgeben. Ich glaube, Sie können dieses Problem nicht lösen, indem Sie Standardnummern verwenden, sondern die ID als Strings lesen (oder eingeben). – Nras

Antwort

13

Matlab verwendet standardmäßig eine 64-Bit Gleitkommadarstellung für Zahlen. Diese haben eine Basis-16-stellige Genauigkeit (mehr oder weniger) und Ihre Zahlen scheinen das zu übersteigen.

Verwendung so etwas wie uint64 Ihre Zahlen zu speichern:

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

Das ist wirklich ein Rundungsfehler, kein Anzeigefehler. Verwenden Sie int2str, um die richtigen Zeichenfolgen für Ausgabezwecke zu erhalten, da wieder num2str eine 64-Bit-Gleitkommadarstellung verwendet und das in diesem Fall Rundungsfehler aufweist.

+0

Das Ausführen von '' num2str (test) '' mit Ihrer Unit64-Eingabe gibt die gewünschten Zeichenfolgen zurück. – Nras

+0

Ich wollte nur sagen, dass es nicht wirklich ein Rundungsfehler ist * per se *, es ist eine intrinsische Grenze der Gleitkommadarstellung. Der Gleitkomma-Standard kann keine so kleine Differenz zwischen zwei Zahlen dieser Größenordnung darstellen. –

+0

Danke uint64 war was ich brauchte. – Lefti

Verwandte Themen