Strange result in subtraction operation
4 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
I have made the following operation in Matlab: 4.238257316854621e+00 - 4.238257316854609e+00
The obvoius result is 1.12e-14, but the answer returned was 1.154631945610163e-14.
I know that math operations are affected by the limited precision of calculations (floating point representation) but this result is really surprising to me.
Can anyone provide some explanation? Is there any way to improve the accuracy of this calculation?
0 commentaires
Réponses (2)
Les Beckham
le 11 Juil 2022
Modifié(e) : Les Beckham
le 11 Juil 2022
The "obvious" result is 1.2e-14 not 1.12e-14 (the different last two digits in your original numbers at the 14 decimal place give 2.1 - 0.9 = 1.2). So 1.154631945610163e-14 is within 4.5e-16 of the "obvious" result which is consistent with the expected floating point precision.
0 commentaires
Jan
le 11 Juil 2022
Modifié(e) : Jan
le 11 Juil 2022
format long g
a = 4.238257316854621;
b = 4.238257316854609;
wanted = 1.12e-14;
got = a - b
drift = max(eps(a), eps(b)) % Expected error:
got - wanted
So the found result is inside the expected error range for IEEE754 doubles. Remember, that you cannot store 16 digits reliably:
digits(20)
a = vpa(4.238257316854621)
You see, the double value is not store accurately already. To do so, you need a char vector as input:
aa = vpa('4.238257316854621')
No, there is no way to improve the accuracy except for increasing the precision, e.g. by using SYM objects or quadrupel precision.
bb = vpa('4.238257316854609')
aa - bb
Voir également
Catégories
En savoir plus sur Numbers and Precision dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!