2010-09-13 5 views
5

Ich habe ein wenig Mühe zu verstehen, wie die Genauigkeit dieser Doppelpunkte das Ergebnis arithmetischer Operationen in Matlab beeinflusst. Ich dachte, da beide & b Doppel sind, wären sie in der Lage, Operationen bis zu dieser Genauigkeit auszuführen. Ich weiß, dass es Rundungsfehler geben kann, aber da diese Zahlen gut innerhalb der 64-Bit-Zahl Darstellung sind, dachte ich nicht, dass das ein Problem wäre.Arithmetische Präzision mit Doppel in Matlab

a = 1.22e-45 
b = 1 
a == 0 
    ans = 0 %a is not equal to zero 
(a + b) == 1 
    ans = 1 

Wie kommt es in der Lage ist, genug Präzision zu tragen zu erkennen a! = 0, aber wenn es auf 1 hinzugefügt hat es keine Veränderung zeigen.

Antwort

6

64-Bit IEEE-754 Fließkommazahlen haben eine ausreichende Genauigkeit (mit einer 53-Bit-Mantisse), um etwa 16 signifikante Dezimalziffern darzustellen. Aber es erfordert mehr wie 45 signifikante Dezimalstellen , um den Unterschied zwischen (1 + a) = 1.00 .... 000122 und 1.000 für Ihr Beispiel zu unterscheiden.

+0

Ich denke, die Mantisse hat 52 Bits (11 Bits für den Exponenten, plus 1 Bit für das Zeichen insgesamt 64-Bit). Ein ausgezeichneter Artikel von * Cleve Moler * (Autor der 1. Version von MATLAB) erklärt alle Details von Fließkommazahlen: [PDF link] http://www.mathworks.com/company/newsletters/news_notes/pdf/Fall96Cleve. pdf – Amro

+2

@Amro: Es gibt ein impliziertes führendes "1" Bit, außer die Zahl ist denormalisiert. Also hat Jim in den meisten Fällen recht (und natürlich für diese Zahlen). –

+0

Danke. Ich habe immer noch einen Weg, die Zahlenrepräsentation in Computern zu verstehen. – ZuluForce

6

"Floating" -Punkt bedeutet genau das - die Genauigkeit ist relativ zum Maßstab der Zahl selbst.

In dem spezifischen Beispiel, das Sie angegeben haben, kann 1,22e-45 alleine dargestellt werden, da der Exponent so eingestellt werden kann, dass er 10^-45 oder ungefähr 2^-150 darstellt.

Andererseits wird 1,0 binär mit der Skala 2^0 (d. H. 1) dargestellt.

Um diese beiden Werte hinzuzufügen, müssen Sie ihre Dezimalpunkte (er ... Binärpunkte) ausrichten, was bedeutet, dass die gesamte Genauigkeit von 1.22e-45 um 150 ungerade Bits nach rechts verschoben ist.

Natürlich haben IEEE-Gleitkommawerte mit doppelter Genauigkeit nur 53 Bits der Mantisse (Genauigkeit), was bedeutet, dass 1,22e-45 im Maßstab von 1,0 praktisch Null ist.

+0

Vielen Dank !! – ZuluForce

3

Um hinzuzufügen, was die anderen Antworten gesagt haben, können Sie die MATLAB-Funktion EPS verwenden, um das Genauigkeitsproblem anzuzeigen, das Sie gerade ausführen. Für eine gegebene doppelte Genauigkeit Gleitkommazahl, die Funktion EPS werden Sie die Entfernung von ihr auf die nächste größte darstellbare Gleitpunktzahl:

>> a = 1.22e-45; 
>> b = 1; 
>> eps(b) 

ans = 

    2.2204e-016 

Beachten Sie, dass der nächste Gleitpunktzahl, die größer als 1 ist, 1.00000000000000022204 ..., und der Wert von a kommt nicht einmal annähernd auf die Hälfte der Entfernung zwischen den beiden Zahlen. Daher 1.

Im Übrigen bleiben a+b endet, können Sie auch sehen, warum a Nicht-Null betrachtet wird, obwohl sie durch einen Blick auf die kleinste darstellbare doppelter Genauigkeit so klein ist, Wert Gleitkommazahlen mit der Funktion REALMIN:

>> realmin 

ans = 

    2.2251e-308 %# MUCH smaller than a!