Sind in MATLAB Variablen standardmäßig doppelt korrekt?

Diese Frage stellte sich auch etwas seltsam, dass ich bemerkte nach der Untersuchung diese Frage weiter...

Ich immer verstanden MATLAB-Variablen werden double-precision standardmäßig. Also, wenn ich etwas zu tun, wie eine variable deklarieren, die mit 20 stellen nach dem Komma:

>> num = 2.71828182845904553488;
>> class(num)  %# Display the variable type
ans =
double

Ich würde erwarten, dass die letzten 4 Ziffern werden ignoriert, da die floating-point relative Genauigkeit in der Größenordnung von 10-16:

>> eps(num)
ans =
    4.440892098500626e-016

Wenn ich versuche, um die Anzahl mit mehr als 16 stellen nach dem Komma (entweder FPRINTF oder SPRINTF), ich bekomme, was ich erwarte, um zu sehen:

>> fprintf('%0.20f\n',num)
2.71828182845904550000
>> sprintf('%0.20f',num)
ans =
2.71828182845904550000

In anderen Worten, Ziffern 17 bis 20 sind alle 0.

Aber die Dinge seltsam, wenn ich den pass num zu den variable precision-Arithmetik-Funktion in der Symbolische Toolbox, sagt er zu repräsentieren Sie die Nummer mit 21 digits of precision:

>> vpa(num,21)
ans =
2.71828182845904553488

WAS?! Die letzten 4 Ziffern wieder aufgetaucht! Sollten Sie nicht verloren, wenn die ursprüngliche Zahl, die ich eingegeben wurde gespeichert als double-precision-variable num? Da num ist eine double-precision-variable, wenn es übergeben wird, um vpa, wie hast vpa wissen, was Sie waren?

Meine beste Vermutung, was passiert ist, dass MATLAB intern repräsentiert num mit mehr Präzision als eine doppelte, da ich initialisiert es auf eine Zahl mit mehr Ziffern hinter dem Komma als eine double-precision-variable umgehen konnte. Ist das wirklich das, was passiert ist, oder etwas anderes?


BONUS: Und hier ist eine weitere Quelle der Verwirrung, wenn Sie nicht bereits über eine Migräne aus den oben genannten...

>> num = 2.71828182845904553488;  %# Declare with 20 digits past the decimal
>> num = 2.718281828459045531;    %# Re-declare with 18 digits past the decimal
>> vpa(num,21)
ans =
2.71828182845904553488  %# It's the original 20-digit number!!!

InformationsquelleAutor der Frage gnovice | 2010-11-19

Schreibe einen Kommentar