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
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.
_dp
es que la precisión sea claramente definido de forma portátil.