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 la 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 mots, 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 la 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'il est passé à l' vpa
, comment avez - vpa
savent 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!!!