Nombres de chiffres significatif avec fortran

Résolu/Fermé
VauRDeC Messages postés 202 Date d'inscription jeudi 27 août 2009 Statut Membre Dernière intervention 8 juin 2012 - 7 juin 2012 à 16:44
VauRDeC Messages postés 202 Date d'inscription jeudi 27 août 2009 Statut Membre Dernière intervention 8 juin 2012 - 8 juin 2012 à 17:12
Bonjour,

Contrairement à ce que la majorité gens, en fait je cherche à réduire le nombre de chiffres après la virgule de mes réel.

Donc ce que je veux, c'est de considérer un certains nombres de chiffres après la virgule de mes réels sans pour autant vouloir les arrondir...
Par exemple, si j'ai "pi" je cherche une option de write ou read qui me donnerait les 3 premiers chiffres par exemple, ou même rien que le premier, c.a.d je voudrais qu'il me donne 3,1 et non 3,10000 par exemple.

J'ai trouvé une option I2.2 de write mais ça ne marche pas à tout les coups...

Merci d'avance

VaµRDeC



10 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
7 juin 2012 à 16:53
hello
I c'est pout integer non ?
essayer F2.2
1
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
8 juin 2012 à 07:56
montre le code
1
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
8 juin 2012 à 11:10
1
VauRDeC Messages postés 202 Date d'inscription jeudi 27 août 2009 Statut Membre Dernière intervention 8 juin 2012 3
7 juin 2012 à 17:01
Merci pour la réponse.

Malheureusement ça ne marche pas :(
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
VauRDeC Messages postés 202 Date d'inscription jeudi 27 août 2009 Statut Membre Dernière intervention 8 juin 2012 3
8 juin 2012 à 11:27
Merci pour vos réponses les gens.
J'ai aussi été sur le site que tu me conseilles Char Sniper mais je ne comprends pas non plus pourquoi ça ne marche pas...
Je vous montre le code, comme à mon habitude il doit y avoir un truc que je n'ai pas du bien réglé...
Le voici:

beta = (/8.7,10.0,12.0,12.5,13.0,13.5,14.0,16.0,18.0,20.0/)
do k = 1, nb
rang = beta(k)
write(numero,FMT='(??.??)') rang
print*,"numero=",numero
enddo


Je vous évite le reste car je me sers de ça pour faire un truc inutilement compliqué :)

Merci encore


VaµRDeC
0
VauRDeC Messages postés 202 Date d'inscription jeudi 27 août 2009 Statut Membre Dernière intervention 8 juin 2012 3
8 juin 2012 à 11:31
J'oubliais,
CHARACTER(len=3) :: numero

Certaines fois il me donne l'erreur : " Fortran runtime error: End of record "
D'autres fois, il m'affiche : "numero=***"
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
8 juin 2012 à 11:33
pour plus de clarté, donne le résultat que tu attends.
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
8 juin 2012 à 12:04
et avec ?
write(numero,FMT='(F4.2)') rang 
0
VauRDeC Messages postés 202 Date d'inscription jeudi 27 août 2009 Statut Membre Dernière intervention 8 juin 2012 3
8 juin 2012 à 12:22
Déjà essayé ducek et ça ne marche pas...

Bon je vais donc vous expliquer ce que je veux faire...

J'ai un répertoire qui contient des sous répertoires nommés : beta_9 ou beta_10 ou encore beta_12.5, vous l'aurez compris tout ce qu'il y a après le _ c'est les nombres qui sont dans le vecteurs beta que j'ai posté tout à l'heure.
Alors dans ces sous répertoires, il y a des fichiers nommés par exemple "resultats.dat", qui contiennent des colonnes de nombres que je voudrais trier...
J'aimerai donc écrire un code fortran qui me ferait tout ça tout seul, au lieu de m'embêter à le compiler pour chaque ficher "resulats.dat" dans chacun de mes sous répertoire beta... C'ést à dire qu'un moment j'en aurai des centaines de sous répertoires beta!!

Donc voici mon code qui ferait tout ce job, je vous évite les déclarations et tout (je sais que l'erreur ne viens pas de là):

beta = (/8.7,10.0,12.0,12.5,13.0,13.5,14.0,16.0,18.0,20.0/)
do k = 1, nb ! nb = la dimension de mon vecteur beta
rang = beta(k)
write(numero,FMT='(??.??)') rang
print*,"numero=",numero ! Pour vérifier que ça a bien marché :)
open(30,file="REPERT/beta"//"_"//trim(numero)//"/resultats.dat",form='formatted')
do i=1,nk ! nk = le nombre de sous répertoires beta dans REPERT
read(30,*) wr(i), wi(i)
enddo
close(30)
enddo

Puis, je trie et je les reclasse dans le fichier "resultats.dat" correspondant...

Voilà, j'espère que ce n'est pas confus...

VaµRDeC
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
8 juin 2012 à 12:40
ok, a peu près. tu obtiens quoi en mettant 2.2 qui ne va pas ?
as tu essayer F6.2 ?
0
VauRDeC Messages postés 202 Date d'inscription jeudi 27 août 2009 Statut Membre Dernière intervention 8 juin 2012 3
8 juin 2012 à 13:55
Pour l'instant, la seul solution pour ça marche plus ou moins, c'est que je déclare la variable "rang" comme integer et que je mette "FMT='(I2.2)'".
Le souci avec cette méthode, c'est qu'il ne va pas tenir compte des sous répertoires beta_Y.X avec Y quelconque et X différent de zéro, par exemple les beat_12.5 ou beta_13.4 mais le reste c'est OK...

Dès que je veux mettre des trucs avec F (genre F6.2 par exemple) je déclare "rang" comme real et ça ne marche plus...

Je vous mets en commentaire quand ça marche et quand ça ne marche pas...
Vous est-il possible de tester, de votre côté, ce que je fais??
0
VauRDeC Messages postés 202 Date d'inscription jeudi 27 août 2009 Statut Membre Dernière intervention 8 juin 2012 3
8 juin 2012 à 13:59
Voici:
At line 42 of file spectre.f90 ! Cette ligne c'est là où il y a write(numero,FMT etc...
Fortran runtime error: End of record
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 8/06/2012 à 14:08
agrandir numero CHARACTER(len=10) ?
0
VauRDeC Messages postés 202 Date d'inscription jeudi 27 août 2009 Statut Membre Dernière intervention 8 juin 2012 3
8 juin 2012 à 14:27
Nickel!!!!!!!!!!! Ça marche!!!! avec FMT='(F4.1)'

Mais il y a quand même un (gros) souci, il arrondi et c'est exactement ce que je ne veux pas :(
Par exemple, pour un sous-répertoire beta_10.17 il cherche beta_10.2

Une remarque au passage, il ne considère pas les entiers avec un chiffre dans la partie entière. Par exemple, ça ne marche pas pour beta_8.12 (mais pour ça je peux m'arranger)..
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
8 juin 2012 à 14:29
et avec FMT='(F5.2)'
0
VauRDeC Messages postés 202 Date d'inscription jeudi 27 août 2009 Statut Membre Dernière intervention 8 juin 2012 3
8 juin 2012 à 14:38
Il garde les deux chiffres après la virgule.
S'il y en a trois, il arrondi pour la deuxième...
0
VauRDeC Messages postés 202 Date d'inscription jeudi 27 août 2009 Statut Membre Dernière intervention 8 juin 2012 3
Modifié par VauRDeC le 8/06/2012 à 14:42
Malgré les petits détails qui restent à régler je considère que mon problème est résolu.
Je vais me débrouiller dans ma façon de créer les sous répertoires pour qu'ils puissent être traités par cette partie de mon code fortran.
Merci énormément pour votre aide dubcek et Char Snipeur.

VaµRDeC
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
8 juin 2012 à 15:04
en fait, pourquoi utiliser des réels ? Tu ne peut pas utiliser des tableaux de string ? Sinon tu peux essayer en utilisant deux entier à la place d'un reel (pour l'arrondi en particulier).

Clairement le fortran n'est pas le mieux pour faire ce genre de traitement. Nous ne savons pas ce que tu veux faire exactement, mais de ce que tu en dit il y a plus simple. Dans un environnement POSIX, tu combines un "for ls beta_*" avec un sort et ça suffit.
0
VauRDeC Messages postés 202 Date d'inscription jeudi 27 août 2009 Statut Membre Dernière intervention 8 juin 2012 3
8 juin 2012 à 15:27
Je ne sais pas ce que c'est que l'environnement POSIX. D'ailleurs, je suis un peu contraint à me servir de fortran parce que tout ce fait dans ce langage dans mon code et c'est d'ailleurs le seul dont je me sers.
D'autre part, comme j'ai besoin de trier, je me sers donc de fortran. C'est pour ça que j'ai dit "inutilement compliqué" :) J'imagine bien qu'il y a plus simple comme façon de faire.
À moins qu'il me soit possible de les combiner...
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
8 juin 2012 à 15:54
POSIX : UNIX LINUX MACOSX BSD.
'sort' est une commande qui trie. Il doit être possible de combiner ce que tu veux. Le plus gros problème c'est fortran. Enfin, tu fais du F90, ça limite les ennuis.
0
VauRDeC Messages postés 202 Date d'inscription jeudi 27 août 2009 Statut Membre Dernière intervention 8 juin 2012 3
8 juin 2012 à 17:12
J'ai trouvé!! Toujours avec fortran!
Il fallait simplement que je transforme mon vecteur beta en chaine de caractère...
character (5) :: beta(nb) = /('8.7 ','10.0 ','12.0 ','12.5 ','13.0 ','13.5 ','14.0 ','16.0 ','18.0 ','20.0 '/)
Tout simplement^^

Merci énormément les gars
A Bientôt pour de nouvelles galères :)

VaµRDeC
0