Diese Frage entstand aus etwas Seltsamem, das mir auffiel, nachdem ich diese Frage weiter untersucht hatte ...
Ich habe MATLAB-Variablen immer standardmäßig als doppelt genau verstanden . Wenn ich also so etwas wie eine Variable mit 20 Nachkommastellen deklarieren würde:
>> num = 2.71828182845904553488;
>> class(num) % Display the variable type
ans =
double
Ich würde erwarten, dass die letzten 4 Ziffern ignoriert werden, da die relative Genauigkeit des Gleitkommas in der Größenordnung von 10-16 liegt :
>> eps(num)
ans =
4.440892098500626e-016
Wenn ich versuche, die Zahl mit mehr als 16 Nachkommastellen anzuzeigen (entweder mit fprintf
oder sprintf
), erhalte ich das, was ich erwartet habe:
>> fprintf('%0.20f\n', num)
2.71828182845904550000
>> sprintf('%0.20f', num)
ans =
2.71828182845904550000
Mit anderen Worten, die Ziffern 17 bis 20 sind alle 0.
Aber es wird merkwürdig, wenn ich num
zur arithmetischen Funktion mit variabler Genauigkeit in der Symbolic Toolbox übergebe und sie auffordere , die Zahl mit 21 Stellen Genauigkeit darzustellen:
>> vpa(num, 21)
ans =
2.71828182845904553488
WAS?! Diese letzten 4 Ziffern sind wieder aufgetaucht! Sollten sie nicht verloren gegangen sein, als die von mir eingegebene ursprüngliche Nummer als Variable mit doppelter Genauigkeit gespeichert wurde num
? Da num
eine doppelte Genauigkeit Variable ist , wenn es um übergeben wird vpa
, wie hat vpa
weiß , was sie waren?
num
Ich gehe davon aus, dass MATLAB intern genauer als ein Doppel darstellt, da ich es mit einer Zahl initialisiert habe, deren Ziffern über dem Dezimalpunkt liegen, als eine Variable mit doppelter Genauigkeit verarbeiten könnte. Passiert das wirklich oder ist etwas anderes los?
BONUS: Und hier ist eine zusätzliche Quelle der Verwirrung, wenn Sie noch keine Migräne von oben haben ...
>> 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!!!