Why the following simple calculation is NOT consistent
1 view (last 30 days)
Show older comments
Sulaymon Eshkabilov
on 4 Oct 2021
Commented: Sulaymon Eshkabilov
on 4 Oct 2021
Here are simple multiplication and division of scalars but the results are not consistent. What is causing this and how to make it consistent?
A1 = 0.025; E1 = 70e9; L1 = 1;
A2 = 0.05; E2 = 100e9; L2 = 1.5;
A3 = 0.075; E3 = 50e9; L3 = 2;
k1 = 3*A1*E1/L1;
k2 = 2*A2*E2/L2;
k3 = A3*E3/L3;
k01 = 3*E1*A1/L1;
k02 = 2*E2*A2/L2;
k03 = E3*A3/L3;
% D1, D2, D3 must be "0"
D1 = k01-k1 % ??? WHY: D1 ~=0
D2 = k02-k2 % = 0
D3 = k03-k3 % = 0
% BUT D1 is NOT "0"
0 Comments
Accepted Answer
Walter Roberson
on 4 Oct 2021
Floating point arithmetic is not commutative.
You can see the effect with even simple calculations
format long g
example = 29/7*7
fprintf('%.999g\n', example)
example - 29
Remember that binary floating point does not use decimal internally.
Using decimal would not solve the problems: consider that in decimal, to 10 decimal places
1/3 == 0.3333333333
0.3333333333 * 3 = 0.9999999999
1 - 0.9999999999 = 0.0000000001
Every finite-representation number base has the same problem when it comes to dividing by a value that is relatively prime to the base. Base 60 arithmetic, for example, would be happy with fractions 1/2, 1/3, 1/4, 1/5, 1/6, 1/10, 1/12 -- but would have the same kind of problems for 1/7 .
More Answers (0)
See Also
Categories
Find more on Matrix Computations in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!