La lecture est réel à partir du fichier en FORTRAN 77 - résultats impairs
-
01-10-2019 - |
Question
Je suis actuellement déconner en FORTRAN 77 et je l'ai rencontré un problème que je ne peux pas sembler figurer dehors. Je suis en train de lire un fichier qui ressemble à ci-dessous:
000120 Description(s) here 18 7 10.15
000176 Description(s) here 65 20 56.95
...
La dernière colonne dans chaque rangée est un montant monétaire (jamais supérieur à 100). Je suis en train de lire le fichier en utilisant un code similaire à ci-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 je pourrais avoir de fuite 9 ou de tout le reste, car il est pas tout à fait précis, mais il ne devrait pas être un peu plus de 95 cents? Peut-être il y a quelque chose que je fais mal, je ne suis pas sûr. Si tout va bien, je ne suis pas coincé avec mon programme en cours d'exécution comme ça! Toute aide est grandement appréciée!
La solution
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, 3 fois, I6, 3 fois, F5) (avec composé des valeurs). Si vous avez l'alignement de l'un et par lecture seule « 56,9 » pour « 56,95 », puis Imprécision virgule flottante pourrait facilement vous donner 56,89999, qui est très proche de 56,9
Vous pouvez également lire la ligne dans une chaîne et lire les nombres de sous-chaînes - cela nécessiterait seulement d'identifier avec précision l'emplacement de la chaîne. Une fois que les sous-chaînes ne contenaient que des espaces et des chiffres, vous pouvez utiliser un moins tatillonne IO dirigée lire:. Lire (string (30:80), *) qté, min_qty, prix