Dans MATLAB, sont des variables VRAIMENT en double précision par défaut?

Cette question s'est posée de quelque chose d'étrange que j'ai remarqué après avoir enquêté sur cette question plus loin...

J'ai toujours compris MATLAB variables à double précision par défaut. Donc, si je devais faire quelque chose comme déclarer une variable avec 20 chiffres après la virgule:

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

Je m'attends à ce que les 4 derniers chiffres pour être ignoré, car l' virgule flottante à précision relative est de l'ordre de 10-16:

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

Si j'essaie d'afficher le nombre avec plus de 16 chiffres après le point décimal (à l'aide de fprintf ou sprintf), j'obtiens ce que je m'attends à voir:

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

En d'autres termes, les chiffres de 17 à 20 sont tous 0.

Mais les choses deviennent étranges quand je passe la num à la précision variable fonction arithmétique dans le Symbolique Boîte À Outils, en disant qu'il représentent le nombre à l'aide de 21 chiffres de précision:

>> vpa(num, 21)
ans =
2.71828182845904553488

QUOI?! Ces 4 derniers chiffres ont réapparu! N'ont-elles pas été perdue lorsque le nombre d'origine, je suis entré a été stocké dans une variable double précision num? Depuis num est une variable double précision lorsqu'elle est passée à vpa, comment avez - vpa savoir ce qu'ils étaient?

Ma meilleure supposition de ce qui se passe est que MATLAB représente en interne num avec plus de précision qu'un double depuis que j'ai initialisé à un nombre avec plus de chiffres après la virgule qu'une variable double précision pourrait manipuler. Est-ce vraiment ce qui se passe, ou autre chose?


BONUS: Et voici une autre source de confusion si vous ne l'avez pas déjà une migraine à partir de ci-dessus...

>> 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 gnovice | 2010-11-19