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.