Fortran - que dice esta instruccion

 
Vista:

que dice esta instruccion

Publicado por carlos (1 intervención) el 04/04/2006 16:13:55
No cacho nada de programación y nuestro profesor de metodos numericos nos hace el curso orientandolo a esta misma. El programa es este:
(es en fortran)
Comparar los valores almacenados en las variables gdif y ngdif en el siguiente programa.

Real*4 Gdif
integer*4 Ngdif
Gdif=52745916.
...
Ngdif=52745916+15
Ngdif=Ngdif-52745916
...
If (Gdif.Eq.Float(Ngdif)) stop
...

Si para la mantisa de las variables real*4 se destinan 3 bytes(incluido el signo), ¿se detendra el programa al ejecutar la instruccion if?¿que concluciones puede extraer de este ejemplo?

de antemado gracias.
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
Imágen de perfil de Javier Hernández Aguilar

RE:que dice esta instruccion

Publicado por Javier Hernández Aguilar (5 intervenciones) el 08/04/2006 02:40:54
Real*4 Gdif
integer*4 Ngdif
Gdif=52745916.
...
Ngdif=52745916+15
Ngdif=Ngdif-52745916
...
If (Gdif.Eq.Float(Ngdif)) stop

Bueno, empecemos con calma.
Las primeras dos instrucciones declaran una cariable real de simple precision y una variable entera larga.
La tercera linea le asigna un valor a la variable real.
La cuarta linea le asigna a la variable entrea el valor que se le asigno a la variable real mas 15. En la siguiente linea le resta a la variable entera el valor que se le asigno a la variable real. Con que fin???
Eso es lo interesante, si se pudiera representar los numeros de manera exacta el resultado de la quinta linea deberia ser 15, pero dado que se expresan en notacion flotante, se pierde cierta precision y es casi completamente seguro que la operacion no devuelva 15.
El problema es que creo esta mal expresado lo que les quiere hacer ver su profesor. La forma correcta deberia ser

Real*4 Gdif
integer*4 Ngdif
Gdif=52745916.
...
Ngdif=52745916+15
Ngdif=Ngdif-15 Aqui esta el cambio, se le deberia restar los 15 que se sumaron.
...
If (Gdif.Eq.Float(Ngdif)) stop

De lo anterior, es de esperarse que ambas variables tengan el mismo valor. Esta comparacion la hace la ultima linea, pero para poder comparar ambas variables se deben expresar en reales o enteras. Para tu caso el comando que emplean es para expresarlas en reales (FLOAT). Y bueno, estoy casi seguro que no se detendra el programa y esto es por una sencilla razon.
A la variable Gdift se le asigno el valor directamente, mientras que a la variable Ngdif se le asigno el valor con operaciones y ahi es donde se peirde precision, asi que no seran iguales y por consiguiente no se detendra el programa.
Espero te haya sido util esta informacion.
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