How to perform division correctly?

12 visualizaciones (últimos 30 días)
Paolo Matteoni
Paolo Matteoni el 23 de En. de 2022
Comentada: the cyclist el 23 de En. de 2022
Recenty I've came across this dilemma when dealing with divisions. Actually when performing the division of a number by a product of others number I expect that the following two codes returns the same result:
a = 1 / (x * y);
b = 1 / x / y;
However, comparing the two results, it returns false logical answer.
Besides the error is in the order of esp (10^-16), on the long run it made my simulation numerically unstable.
Which sintax I am expect to use? Anyone experienced something similar?
I leave my own code to reproduce the behavior!
a = 72000 / 12 / ( 1 - 0.3 ^ 2 );
b = 72000 / (12 * ( 1 - 0.3 ^ 2 ));
a == b % false
% eps = 2.2204e-16
rel_err = (a-b)/a; % about -1.38e-16
  1 comentario
the cyclist
the cyclist el 23 de En. de 2022
Not directly related to what you are seeing here, but also be aware that the slash represents the mrdivide operation, not simple division. It matters when you are dealing with vectors and matrices.

Iniciar sesión para comentar.

Respuesta aceptada

the cyclist
the cyclist el 23 de En. de 2022
Variants of this question come up a lot. It is not a "problem with division", but a consequence of the fact that some decimal numbers cannot be represented exactly in a floating-point representation. I recommend reading through some of the answers to this question.
Here is an example of the inexact representation of a decimal number, using James Tursa's num2strexact function from the File Exchange:
>> num2strexact(0.3)
ans =
0.299999999999999988897769753748434595763683319091796875

Más respuestas (1)

Voss
Voss el 23 de En. de 2022
It's not because of division, per se, but because of floating-point arithmetic.
No division here:
a = 3*0.3;
b = 0.9;
a == b
ans = logical
0
rel_err = (a-b)/a
rel_err = -1.2336e-16
abs_err = abs(a-b)
abs_err = 1.1102e-16

Productos


Versión

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by