Como definir valores de precisão dupla no Fortran

10

Recentemente, encontrei um problema bizarro com o FORTRAN95. Inicializei as variáveis ​​X e Y da seguinte maneira:

X=1.0
Y=0.1

Mais tarde eu os adiciono e imprimo o resultado:

1.10000000149012

Após examinar as variáveis, parece que 0,1 não é representado em dupla precisão com total precisão. Existe alguma maneira de evitar isso?

Paulo
fonte

Respostas:

21

Outra maneira de fazer isso é primeiro especificar explicitamente a precisão desejada na variável usando o intrínseco SELECTED_REAL_KIND e depois usá-lo para definir e inicializar as variáveis. Algo como:

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

Uma boa vantagem de fazer dessa maneira é que você pode armazenar a definição de dpem um módulo e, em seguida, USEnesse módulo, quando necessário. Agora, se você quiser alterar a precisão do seu programa, precisará alterar apenas a definição dpnesse local em vez de pesquisar e substituir todos os D0s no final de suas inicializações de variáveis. (É também por isso que eu recomendo não usar a 1.0D-1sintaxe para definir Y como sugerido. Funciona, mas torna mais difícil encontrar e alterar todas as instâncias no futuro.)

Esta página no Fortran Wiki fornece boas informações adicionais sobre SELECTED_REAL_KIND.

Barron
fonte
Isso mesmo, essa deve ser a abordagem padrão.
Ondřej Čertík 14/03/12
E com que frequência as pessoas realmente precisam alterar a precisão de seus programas às cegas, sem passar de procedimento a procedimento de qualquer maneira e testando? O principal motivo para usar o _dpesquema é para que a precisão seja claramente definida de maneira portátil.
ja72
12

Você declarou as variáveis ​​como precisão dupla, mas as inicializou com valores de precisão únicos.

Você poderia ter escrito:

X=1.0d0
Y=1.0d-1

A resposta de Barron abaixo é outra maneira de fazer uma precisão dupla literal, com a vantagem de permitir alterar a precisão de suas variáveis ​​posteriormente.

Dan
fonte
11
Eu acho que um deve estar usando o método 1.0_dp descrito no post abaixo.
Ondřej Čertík 14/03/12
11
Em segundo lugar, o comentário de @ OndřejČertík - a resposta de Barron é a melhor.
OscarB