2017-07-22 5 views
1

Je vais avoir du mal à additionner 3 doubles chiffres dans la fenêtre de commande Matlab, voici mes variablesRésumant doubles variables dans Matlab

>> a = 0.45; 
>> b = 0.05; 
>> c = -0.5; 

quand je les résume comme ça, je reçois 1.3878e-17

>> c + a + b 
ans = 
    1.3878e-17 

Mais quand je l'utilise entre parenthèses, il retourne

>> c + (a + b) 
ans = 
0 

les sommant également dans cet ordre retourne à nouveau

>> a + b + c 
ans = 
0 
+2

Regardez caché les erreurs d'arrondi - https://au.mathworks.com/help/symbolic/digits.html. Cela semble simplement provenir de la précision de la distribution implicite. –

Répondre

1

Dans le stockage habituel des flotteurs dans les langages de programmation à l'aide IEEE 754. Par conséquent, pour le stockage de certains nombres flottants qui ne peuvent pas être montrés par la somme de 2^i, il y aurait quelques erreurs (en base 2) telles que 0.3.

Comme mentionné dans les commentaires, vous pouvez utiliser des chiffres pour trouver ces erreurs:

digits(100); 
vpa(a) 
    >> 0.4500000000000000111022302462515654042363166809082031250000000000000000000000000000000000000000000000 
vpa(b) 
    >> 0.05000000000000000277555756156289135105907917022705078125000000000000000000000000000000000000000000000 
vpa(c) 
    >> -0.5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 
vpa(a+b) 
    >> 0.5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  

vpa(c+a) 
    >> -0.04999999999999998889776975374843459576368331909179687500000000000000000000000000000000000000000000000 

Comme vous pouvez le voir dans ce qui précède, à cause de cette erreur, somme de a et c est pas exactement comme vous » attendu (à cause d'une erreur dans le stockage des points flottants dans la base 2 dans IEEE 754).

Par conséquent, l'ordre de + est important que vous avez trouvé à travers ces expressions. Par conséquent, la préférence de plus est de gauche à droite, et la préférence de parenthèse est supérieure à plus, dans c + (a + b) et a + b + c, le a + b est fait en premier ,. Ensuite, vous pouvez voir la somme est exacte dans le ci-dessus. Cependant, dans c + a + b, le c + a est arrivé plus tôt et vous pouvez voir cette somme n'est pas exacte, donc le résultat de cette somme avec b pourrait avoir une erreur.

De cette façon, vous pouvez trouver a + c + b n'est pas exacte que vous voulez. Et:

vpa(c + b) 
    >> -0.4500000000000000111022302462515654042363166809082031250000000000000000000000000000000000000000000000 

Ainsi,

c + b + a 
    >> 0