Quel est le moyen le plus sûr de définir une variable de + Infinity en Fortran? Pour le moment, j'utilise: mais je me demande s'il y a une meilleure façon? P> P>
5 Réponses :
Je ne sais pas sur le plus sûr, mais je peux vous offrir une méthode alternative. J'ai appris à le faire de cette façon: Si vous utilisez des valeurs exceptionnelles dans les expressions (je ne pense pas que cela soit généralement conseillé), vous devez accorder une attention particulière à la manière dont votre compilateur les gère, Vous pourriez avoir des résultats inattendus autrement. p> p>
Si votre compilateur prend en charge ISO TR 15580 IEEE Arithmétique qui fait partie de Norme dite Fortran 2003 que vous pouvez utiliser des procédures à partir de modules IEEE_ *.
PROGRAM main
USE ieee_arithmetic
IMPLICIT NONE
REAL :: r
IF (ieee_support_inf(r)) THEN
r = ieee_value(r, ieee_negative_inf)
END IF
PRINT *, r
END PROGRAM main
Je ne voudrais pas compter sur le compilateur pour soutenir la norme IEEE et faire à peu près ce que vous avez fait, avec deux modifications: p>
Je n'aterais pas Vous utilisez énorme (1.) + énorme (1.) code>, puisque sur certains compilateurs, vous pouvez vous retrouver avec -huge (1.) + 1 < / Code> --- et cela peut provoquer une fuite de mémoire (ne sait pas la raison, mais c'est un fait expérimental, de dire). P> li>
réel code> types ici. Personnellement, je préfère garder tous mes numéros de points flottants comme réel * 8 code>, d'où toutes les constantes de flotteur sont qualifiées avec d0 code>, comme ceci: énorme (1.d0 ) code>. Ce n'est pas une règle, bien sûr; Certaines personnes préfèrent utiliser les deux réel code> -s et real * 8 code> -s. p> li>
ol>
real * 8 code> et double précision code> ( 1.d0 code>) ne sont pas nécessaires au même type réel. Et bien sûr, d'utiliser une précision simple ou double, n'est pas une question de préférence personnelle, mais d'arguments et de tests mathématiques.
Je ne sais pas si la solution ci-dessous fonctionne sur tous les compilateurs, mais c'est une belle façon mathématique d'atteindre l'infini comme -log (0).
program test
implicit none
print *,infinity()
contains
real function infinity()
implicit none
real :: x
x = 0
infinity=-log(x)
end function infinity
end program test
Il fonctionnera sur des machines conformes à IEEE, si vous n'acceptez pas le piégeage FPE. Mais si vous travaillez avec des infinis, il serait idiot de le faire.
Cela semble fonctionner pour moi.
Définissez un paramètre puis utilisez-le en si des tests. P> Lorsque vous compilez avec IFORT & RUN, je reçois p> < Pré> xxx pré> p>
Cela ne fonctionne pas, du moins à Gfortran. Il soulève une erreur de compilateur.