Recentemente, encontrei um problema bizarro com 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
Depois de examinar as variáveis, parece que 0,1 não é representado em precisão dupla com precisão total. Existe alguma maneira de evitar isso?
Resposta
Outra maneira de fazer isso é primeiro especificar explicitamente a precisão que você deseja na variável usando o SELECTED_REAL_KIND intrínseco e, em seguida, usar isso para definir e inicializar as variáveis. :
INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15) REAL(dp) :: x x = 1.0_dp
Uma boa vantagem de fazer desta forma é que você pode armazenar a definição de dp
em um módulo, então USE
esse módulo onde necessário. Agora, se você quiser alterar a precisão de seu programa, você só precisa alterar a definição de dp
naquele lugar, em vez de pesquisar e substituir todos os D0
s no fim de suas inicializações de variáveis. (É também por isso que eu recomendo não usar a sintaxe 1.0D-1
para definir Y conforme sugerido. Funciona, mas torna mais difícil encontrar e alterar todas as instâncias no futuro.)
Esta página no Fortran Wiki fornece algumas boas informações adicionais sobre SELECTED_REAL_KIND
.
Comentários
Resposta
Você declarou as variáveis como precisão dupla, mas as inicializou com valores de precisão simples.
Você poderia ter escrito:
X=1.0d0 Y=1.0d-1
Barron “s responder abaixo está outra maneira de fazer uma precisão dupla literal, com a vantagem de permitir que você altere a precisão de suas variáveis posteriormente.
Comentários
- Acho que se deveria usar o método 1.0_dp descrito na postagem abaixo.
- Segundo @ OndřejČert í k ' comentário – Barron ' a resposta é a melhor.
_dp
é para que a precisão seja claramente definido de maneira portátil.