2010-06-30 4 views
1

Je suis actuellement en train de déconner dans FORTRAN 77 et j'ai rencontré un problème que je n'arrive pas à comprendre. Je suis en train de lire un fichier qui ressemble à ci-dessous:Lecture REAL à partir du fichier dans FORTRAN 77 - résultats impairs

000120  Description(s) here  18  7  10.15 
000176  Description(s) here  65  20 56.95 
... 

La dernière colonne de chaque ligne est une somme d'argent (jamais supérieur à 100). Je suis en train de lire le fichier en utilisant un code similaire au-dessous

  integer pid, qty, min_qty 
      real price 
      character*40 descrip 

      open(unit=2, file='inventory.dat', status='old') 
      read(2, 100, IOSTAT=iend) pid, descript, qty, min_qty, price 
100  format(I11, A25, I7, I6, F5) 

Tout semble être lu très bien, à l'exception de la dernière colonne. Quand je vérifie la valeur du prix, disons par exemple, pour la deuxième ligne; au lieu d'obtenir 56,95 je reçois quelque chose comme 56,8999999999.

Maintenant, je comprends que j'ai peut-être des traînées de 9 ou autres parce que ce n'est pas totalement précis, mais ne devrait-il pas être un peu plus près de 95 cents? Peut-être qu'il y a quelque chose que je fais de mal, je ne suis pas sûr. J'espère que je ne suis pas coincé avec mon programme en cours d'exécution comme ça! Toute aide est grandement appréciée!

Répondre

1

Est-ce exactement le code que vous utilisez pour lire le fichier? Avez-vous des formats "X" pour aligner les colonnes? Tels que (I11, A25, 2X, I7, 3X, I6, 3X, F5) (avec des valeurs inventées). Si vous avez obtenu l'alignement par un et lire seulement "56.9" pour "56.95", alors l'imprécision en virgule flottante pourrait facilement vous donner 56.89999, ce qui est très proche de 56.9

Vous pourriez également lire la ligne dans une chaîne et lire les nombres des sous-chaînes - cela ne nécessiterait que l'identification précise de l'emplacement de la chaîne. Une fois que les sous-chaînes contenaient seulement des espaces et des nombres, vous pouviez utiliser un IO moins fin: read (string (30:80), *) qty, min_qty, price.

+0

vous aviez raison en ce qu'il ne lisait pas le nombre entier. Merci! –

Questions connexes