Fortran - (Desesperación). Pérdida de información al operar.

 
Vista:
sin imagen de perfil

(Desesperación). Pérdida de información al operar.

Publicado por David (2 intervenciones) el 26/12/2013 10:22:11
¡Hola!

Muy buenas a todos.
Antes de nada agradecer el tiempo a la gente por tomarse la molestia de contestar.

Sé que en los foros la gente tiene la mala costumbre de NO USAR EL BUSCADOR.
Bien, yo lo he usado, ampliamente, en varias webs y en Google y no he conseguido encontrar ninguna información que me haga comprender, (quizá debo ser tontico), una "pequeña" particularidad de Fortran.


Soy estudiante de primero de Ingeniería de Caminos y en la asignatura de Informática estamos aprendiendo Fortran, nunca he programado antes, ni en éste ni en otros lenguajes, así que mis conocimientos son prácticamete nulos.

Lo explico analíticamente que se entiende mejor.
Allá va:

Program me_invento_los_numeros
Implicit none
!Declaración de variables
real :: a, b, c
!Damos valores
a = 22.2323
b = 22
!Valores derivados de operaciones y cálculos
c = a -b
!Salida de datos
print* ,c
End program


Y ENTONCES PONE EN LA CONSOLA 0.23229980

Lo cual quiere decir que según Mr. Fortran: 22.2323 - 22 = 0.23229980

He leído, en una web americana, que el resultado pierde información al ser derivado de una operación, (traduce a binario y luego lo vuelve a traducir a decimal), pero no consigo llegar a comprender CÓMO se pierde la información y sobre todo, lo más importante. QUÉ HACER PARA QUE ESTO NO OCURRA.

Si alguien me lo explica, (y consigue que me entere), a su satisfacción personal por ayudar a un pobre desconocido debe sumarle la de haberme salvado el culo en la asignatura, a mí y a otros cinco o seis perdidos más. Repetir cuesta 250 eurazos, y esos hijos de una hiena se aseguran de que no haya pérdida de información en esa cifra.

¡Un saludo y gracias! :D
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
sin imagen de perfil

(Desesperación). Pérdida de información al operar.

Publicado por Antonio (4 intervenciones) el 27/12/2013 12:40:47
Hola David, yo programo en otra versión de fortran, aun así lo he probado y ocurre exactamente lo mismo, como bien sabes esa pérdida se debe al traducir a binario, en principio no se me ocurre una solución formal y desconozco si existe forma de solucionarlo, sin embargo existe una forma de sacar el verdadero resultado, te la pongo y te digo las precauciones que debes tener al usarlo:

1
2
3
4
5
6
7
8
9
10
11
program operacion
        real a,b,c
        a=22.2323
        b=22
        a=a*10000
        b=b*10000
        c=a-b
        c=c/10000
        write(*,*) c
        pause
        end

De esta forma los decimales de los valores reales desaparecen, se resta sin dar error y a continuacion se vuelve a colocar los decimales en su sitio.

Para poder usarlo debes conocer el número de decimales que tengan tus números para asi multiplicar por el valor correcto, si desconoces el número de decimales puedes usar el factor máximo que es: 1000000000 sin embargo debes tener en cuenta que si al multiplicar por ese valor, el número resultante es mayor de 2147483647 el programa dará error debido a que sobrepasas la capacidad del tipo de dato. Aún así puedes usarlo si en vez de declarar las variables en tipo real las declaras en tipo doble precision.

Prueba a ver que tal te va y cuéntanos.
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

(Desesperación). Pérdida de información al operar.

Publicado por David (2 intervenciones) el 03/01/2014 00:47:56
Muchas gracias por la info, tenía intuitivamente una idea aproximada pero me lo has aclarado bastante.

El problema es que cuando solicitas un dato como por ejemplo una medida en radianes, realmente no sabes el número de decimales que se van a introducir, con lo cual no puedes prever la pérdida de información. He probado con doble precisión pero el error se magnifica a mínimos, sigue inventando cifras, que, aunque son menos relevantes siguen siendo ficticias, con lo cual, doble problema.

De cualquier manera agradezco mucho tu respuesta.

Feliz año nuevo y esas cosas.
Un saludo.

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
sin imagen de perfil

(Desesperación). Pérdida de información al operar.

Publicado por Antonio (4 intervenciones) el 04/01/2014 11:29:14
Mírate esto
http://support.microsoft.com/kb/42980/es

Ese error se produce en la mayoría de lenguajes de programación, sin embargo, para fines comerciales es mas grave el cometer estos errores, Cobol es un lenguajes orientado a fines comerciales y por ello cuenta con una característica que evita estos errores.
No estoy muy al tanto de las nuevas versiones de fortran, 2003 y 2008, pero infórmate a ver si ya cuentan con una solución a este problema.

Feliz año! :)
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

(Desesperación). Pérdida de información al operar.

Publicado por Capitan Kirk (19 intervenciones) el 13/01/2014 10:38:43
Es, simplemente, debido a temas de precisión. En efecto, el problema deriva del paso de los valores numéricos en coma flotante a binario. En binario, la parte fraccionaria de ese número resulta ser un decimal periódico, con lo cual, al ser la precisión del ordenador limitada, puedes tener pérdida de información, el resultado puede aparecerte ligeramente por debajo o ligeramente por encima del valor que esperas. La pérdida de información no ocurre al ser derivado de una operación; simplemente, ocurre al pasar un número con parte fraccionaria a binario. Esto es inevitable, y únicamente se puede paliar utilizando variables de más precisión.

Por ejemplo, si multiplicas 0.1 por 10 el resultado sería 1, pero si en lugar de multiplicar haces la suma 10 veces, puede salirte 1.00000012 como resultado.

Así pues, como solución lo dicho: Variables de más precisión (en FORTRAN el tipo REAL creo que corresponde a 4 bytes, comprueba en tu compilador los tipos para más precisión, puede ser REAL8 o DOUBLE PRECISION para 8 bytes). No resolverá del todo el problema, pero puede que lo lleve a una zona en la que no te cree problemas. También, y ya de cara a la presentación de los datos (en una tabla, por ejemplo), limita el número de cifras decimales a presentar.

También ten en cuenta que las comparaciones de igualdad entre dos valores en coma flotante se pueden ver afectadas por esto.

Si tienes alguna otra duda, ya sabes dónde estamos, o mándame un correo.

Saludos,
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