Matlab - Un error en Matlab, c++, Foltran en una operación

 
Vista:

Un error en Matlab, c++, Foltran en una operación

Publicado por Julián (1 intervención) el 14/06/2007 16:56:23
Hola

Alguien sabe porque Matlab y algunos otros compiladores como Foltran y C++ realizan mal una simple operación matemática???

La operación es la siguiente:

0.1-(0.01*1000*(-0.055-(-0.065)))

Hecha a mano, el resultado es 0. Pero al hacerla en Matlab o en c++ o en Foltran el resultado es: -1.3878e-17, y en todos es el mismo.

El único programa que encontré que hiciera bien la operación fue una calculadora cientifica para Linux Qalqulated http://qalqulate.sourceforge.net. Y mi vieja calculadora cientifica una CASIO 4000 (una reliquia)

Alguien sabría explicarme???
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Un error en Matlab, c++, Foltran en una operaci

Publicado por Pumy (38 intervenciones) el 14/06/2007 19:48:40
Desde el momento en que usas valores decimales la máquina está usando tipos de coma flotante. Estos tipos permiten ajustar el compromiso entre magnitud y precisión cambiando el valor de un exponente. Es decir, que puedo igual operar con valores del orden de 0.01 que con otros del orden de 1e-10 y ese exponente se modifica según el resultado de las operaciones.

La representación de estos números además es binaria y además el número de bits es finito, por lo que la operación para la CPU no es tan evidente como nos pueda parecer a simple vista multiplicar 0.01*1000, ya sabes que en binario las multiplicaciones fáciles son por potencias de 2, que es un desplazamiento a la izquierda. En cambio una multiplicación por 1000 en binario y además sobre operadores en coma flotante puede ser costosa en tiempo de cpu y necesitar operaciones intermedias en las que se pierda algún bit poco significativo debido a la longitud finita de los registros.

El resultado es el que has observado, aunque hay que decir que un error del orden de 1e-17 suele ser despreciable cuando se está trabajando con valores de los cuales el más pequeño es del orden 1e-3.

Si por ejemplo tienes problemas porque debes detectar cuándo la operación da 0 te sugiero que compares si su valor absoluto es menor que un cierto umbral muy pequeño.

La Linux Qualqulated debe usar algún algoritmo que evita este problema. Acabo de comprobar que la calculadora que viene por defecto en ubuntu también da 0 ¿Y qué decir de las casio que de tantos apuros nos han sacado siempre? :D
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

soy nuevo en matlab

Publicado por pepe ayuda! porfa.. (1 intervención) el 29/11/2007 01:47:48
tengo una line a en matlab, el problema es que soy nuevo en ese lenguaje y no encuentro el error, por mas que le busco y le busco ese parentesis parece estar bien pero el compilador marca el siguiente error..

U(:,1)=1/2*[ (BS2(1)^2+BS2(2)^2)-
(BS1(1)^2+BS1(2)^2) - (c*dT1_2(1))^2
(BS3(1)^2+BS3(2)^2)-
(BS1(1)^2+BS1(2)^2) - (c*dT1_3(1))^2
(BS4(1)^2+BS4(2)^2)-
(BS1(1)^2+BS1(2)^2) - (c*dT1_4(1))^2];
este codigo es de 1 sola linea y marca este error..
Unbalanced or misused parentheses or brackets.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar