IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

Ecriture entier de longueur variable sans espace


Sujet :

Fortran

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 18
    Points : 15
    Points
    15
    Par défaut Ecriture entier de longueur variable sans espace
    Bonjour à tous,

    J'ai besoin d'une routine qui écrit un nombre (mettons un entier) de longueur variable d'un appel de la routine à l'autre en supprimant les espaces de début.

    J'ai expérimenté deux solutions "maison" qui marchent très bien mais si quelqu'un a une idée qui ressemble moins à de la dibouille, je suis preneuse !! Et si non (sniff !), laquelle me conseilleriez-vous ? J'ai opté pour la seconde plus facilement adaptable à d'autres types de nombre.

    Solution 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Integer :: val !entier*4
    Integer :: i
    Character(len=6) :: fmt
     
    Do i = 1, 10
      If ((i==10).or.(abs(val) < 10**i)) Then
        If (val<0) then
          write(fmt,'(A,I2,A)') '(I',i+1,')'
          write(*,fmt) val
        Else If (val>=0) then
          write(fmt,'(A,I2,A)') '(I',i,')'
          write(*,fmt) val
        End If				
        Exit
      End If
    End Do
    Solution 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Integer :: val !entier*4
    Integer :: i = 1
    Character(len=12) :: charVal
     
    write(charVal,'(I)') val
    i = verify(charVal,' ')
    write(*,'(A)') charVal(i:len_trim(charVal))
    Merci à tous !

    Mathlus.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    write(*,'(i0)') val ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 18
    Points : 15
    Points
    15
    Par défaut Génial !
    Je ne connaissais et c'est exactement ce que je voulais !
    Merci beaucoup ! Tu es vraiment une mine d'or !

    Du coup, j'ai fait quelques tests avec les real et '(f0.6)' marche très bien !! A l'exception de petits problèmes d'arrondis que l'on retrouve de toute façon en écrivant par exemple '(f12.6)'.

    Je réduirai peut-être le nombre de chiffres significatifs mais ça m'embête un peu... Je suppose qu'il n'y a pas de solution miracle cette fois ??

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    Le problème d'arrondi, il vient de tes calculs, pas de l'impression. Si tu veux imprimer plus de précision que tes calculs n'en génèrent, tu dois nécessairement augmenter la précision de tes calculs...

    real (4) --> real (8)

    123.45 --> 123.45_8

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 18
    Points : 15
    Points
    15
    Par défaut C'est ce que j'ai pensé aussi...
    Mais non !

    J'ai écrit un petit programme idiot qui vient lire un real à l'écran et le réécrit. Si tu laisses en format libre, pas de problème mais si tu imposes un nombre de décimales (mettons 4 si on travaille avec des real*4. si j'en demande plus, suis d'accord, ça peut pas marcher), je t'assure qu'avec certains nombres, tu as des surprises...

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    Excuse moi, j'ai fait des raccourcis dans mon explication.

    Un real (4), contient 6,9 chiffres de précision environ. Ce n'est pas un nombre entier; ça découle de la représentation interne en binaire. Un real (8) (ou un double precision), en contient légèrement au dessus de 15. On parle de chiffre de précision, pas de nombre de décimales. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    real (4) :: r
    r = 0.000123456789 ! assigne environ 0.0001234568 à r
    write(*,'(1x,f0.8)') r ! devrait afficher 0.00012346
    r = 12345678.9123 ! assigne environ 12345680 +/- 10 à r
    write(*,'(1x,f0.2)') r ! devrait afficher environ 12345680 +/- 10, les derniers x.xx étant totalement indéterminés
    Dans ton programme très simple, l'impression par * cause moins de problème d'arrondi car la librairie de formatage ajoute le nombre de décimales en fonction de la précision du chiffre.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Ok ! Je comprends mieux pourquoi si j'essaie d'écrire 6754.768 avec 4 chiffres après la virgule en travaillant avec des real*4, j'ai une perte de précision... Tout simplement parce que je lui demande trop de chiffres significatifs par rapport à ce qu'il est capable de me fournir !

    Encore merci pour ta patience !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Permuter deux variables sans variable temporaire
    Par khayyam90 dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 09/01/2015, 08h02
  2. Boucle for sur une variable sans prendre en compte les espaces
    Par laurentze dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 23/03/2012, 11h15
  3. Réponses: 1
    Dernier message: 20/11/2007, 15h12
  4. [PHP-JS] Envoi de variable sans passer par un submit
    Par adilou1981 dans le forum Langage
    Réponses: 4
    Dernier message: 15/11/2004, 19h21
  5. [debutant][jsp]Passage d'entier avec une session sans cookie
    Par o151181 dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 04/02/2004, 18h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo