Cómo establecer valores de precisión doble en Fortran

10

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

X=1.0
Y=0.1

Luego los agrego e imprimo el resultado:

1.10000000149012

Después de examinar las variables, parece que 0.1 no está representado con doble precisión con total precisión. Hay alguna manera de evitar esto?

Paul
fuente

Respuestas:

21

Otra forma de hacer esto es primero especificar explícitamente la precisión que desea en la variable usando el intrínseco SELECTED_REAL_KIND 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 dpen un módulo, luego USEese módulo donde sea necesario. Ahora, si alguna vez desea cambiar la precisión de su programa, solo tiene que cambiar la definición de dpese lugar en lugar de buscar y reemplazar todos los D0s al final de sus inicializaciones variables. (Esta es también la razón por la que recomendaría no usar la 1.0D-1sintaxis 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 brinda buena información adicional sobre SELECTED_REAL_KIND.

Barron
fuente
Así es, este debería ser el enfoque estándar.
Ondřej Čertík
¿Y con qué frecuencia las personas realmente tienen que cambiar la precisión de sus programas a ciegas sin tener que ir procedimiento por procedimiento de todos modos y realizar pruebas? La razón principal para usar el _dpesquema es para que la precisión esté claramente definida de una manera portátil.
ja72
12

Declaró las variables como precisión doble, pero las inicializó con valores de precisión únicos.

Podrías haber escrito:

X=1.0d0
Y=1.0d-1

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

Dan
fuente
1
Creo que uno debería estar usando el método 1.0_dp descrito en la publicación a continuación.
Ondřej Čertík
1
Respaldo el comentario de @ OndřejČertík: la respuesta de Barron es la mejor.
OscarB