Cette question a été posée sur quelque chose d'étrange que j'ai remarqué après avoir enquêté sur this question plus loin ...Dans MATLAB, les variables sont-elles VRAIMENT en double-précision par défaut?
J'ai toujours compris les variables Matlab être double-precision 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
j'attendre les 4 derniers chiffres à ignorer, puisque le floating-point relative accuracy est de l'ordre de 10 -16 :
>> eps(num)
ans =
4.440892098500626e-016
Si je tente d'afficher le nombre avec plus de 16 chiffres après la virgule (en utilisant FPRINTF ou SPRINTF), je reçois ce que j'attends à voir:
>> fprintf('%0.20f\n',num)
2.71828182845904550000
>> sprintf('%0.20f',num)
ans =
2.71828182845904550000
En d'autres termes, les chiffres 17 à 20 sont tous 0.
Mais les choses deviennent bizarres quand je passe num
au variable precision arithmetic function dans le Symbolic Toolbox, lui disant de représenter le nombre en utilisant 21 chiffres de précision:
>> vpa(num,21)
ans =
2.71828182845904553488
QUOI ?! Les 4 derniers chiffres ont réapparu! Ne devraient-ils pas être perdus lorsque le numéro d'origine que j'ai entré a été enregistré comme variable à double précision num
? Puisque num
est une variable à double précision lorsqu'elle est passée à vpa
, comment vpa
a-t-elle été identifiée? Ma meilleure idée de ce qui se passe est que MATLAB représente en interne num
avec plus de précision qu'un double puisque je l'ai initialisé à un nombre avec plus de chiffres après le point décimal qu'une variable à double précision pourrait gérer. Est-ce vraiment ce qui se passe, ou est-ce que quelque chose d'autre se passe?
BONUS: Et voici une autre source de confusion si vous ne l'avez pas déjà une migraine de ce qui précède ...
>> 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!!!
+1 pour répondre à une question instructive intéressante! – Jonas
Aha! Je viens donc d'utiliser l'expansion décimale exacte d'une valeur binaire comme mon numéro de test. Tout s'explique maintenant! Je ne sais pas comment j'ai réussi à manquer cela, peut-être que c'était dû au manque de sommeil depuis que ma fille fait ses dents et m'a gardé toute la nuit. ;) – gnovice
@Andrew: travaillez-vous chez MathWorks? – Mikhail