Recientemente, encontré un problema extraño con FORTRAN95. Inicialicé las variables X e Y de la siguiente manera:

X=1.0 Y=0.1 

Más tarde, las agrego e imprimo el resultado:

1.10000000149012 

Después de examinar las variables, parece que 0.1 no se representa con doble precisión con total precisión. ¿Hay alguna forma de evitar esto?

Respuesta

Otra forma de hacer esto es primero especificar explícitamente la precisión que desea en la variable usando el SELECTED_REAL_KIND intrínseco y luego usar esto para definir e inicializar las variables. Algo como :

INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15) REAL(dp) :: x x = 1.0_dp 

Una buena ventaja de hacerlo de esta manera es que puede almacenar la definición de dp en un módulo, luego USE ese módulo donde sea necesario. Ahora, si alguna vez quieres cambiar la precisión de su programa, solo tiene que cambiar la definición de dp en ese lugar en lugar de buscar y reemplazar todas las D0 en el final de sus inicializaciones de variables. (Esta es también la razón por la que recomiendo no usar la sintaxis 1.0D-1 para definir Y como se sugiere. Funciona, pero hace que sea más difícil encontrar y cambiar todas las instancias en el futuro).

Esta página en Fortran Wiki ofrece buena información adicional sobre SELECTED_REAL_KIND.

Comentarios

  • Eso ' s correcto, este debería ser el enfoque estándar.
  • ¿Y con qué frecuencia las personas realmente tienen que cambiar la precisión de sus programas a ciegas sin pasar de un procedimiento a otro y realizar pruebas? La razón principal para usar el esquema _dp es que la precisión sea claramente definido de forma portátil.

Respuesta

Declaraste las variables como de doble precisión, pero las inicializaste con valores de precisión simple.

Podría haber escrito:

X=1.0d0 Y=1.0d-1 

Barron «s respuesta a continuación hay otra forma de hacer una precisión doble literal, con la ventaja de que le permite cambiar la precisión de sus variables en un momento posterior.

Comentarios

  • Creo que uno debería usar el método 1.0_dp descrito en la publicación a continuación.
  • Yo segundo @ OndřejČert í k ' comentario – Barron ' s respuesta es la mejor.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *