10
votes

Infinity en fortrange

Quel est le moyen le plus sûr de définir une variable de + Infinity en Fortran? Pour le moment, j'utilise: xxx

mais je me demande s'il y a une meilleure façon?


0 commentaires

5 Réponses :


0
votes

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: xxx

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.


0 commentaires

10
votes

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


0 commentaires

1
votes

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:

  1. Je n'aterais pas énorme (1.) + énorme (1.) , 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).

  2. Vous utilisez réel types ici. Personnellement, je préfère garder tous mes numéros de points flottants comme réel * 8 , d'où toutes les constantes de flotteur sont qualifiées avec d0 , comme ceci: énorme (1.d0 ) . Ce n'est pas une règle, bien sûr; Certaines personnes préfèrent utiliser les deux réel -s et real * 8 -s.


1 commentaires

real * 8 et double précision ( 1.d0 ) 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.



1
votes

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


1 commentaires

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.



-1
votes

Cela semble fonctionner pour moi. Définissez un paramètre xxx

puis utilisez-le en si des tests. xxx

Lorsque vous compilez avec IFORT & RUN, je reçois < Pré> xxx


1 commentaires

Cela ne fonctionne pas, du moins à Gfortran. Il soulève une erreur de compilateur.