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

Langage Perl Discussion :

Problème : incrémentation !! perl a fumé ?


Sujet :

Langage Perl

  1. #1
    Membre régulier Avatar de Ickou
    Inscrit en
    Avril 2005
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 174
    Points : 108
    Points
    108
    Par défaut Problème : incrémentation !! perl a fumé ?
    je cherche à avoir toutes les valeurs entre -1 et 1 avec une incrémentation de 0.01 ........
    mais à 0.44 perl perd la tête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     for ($ii=1; $ii>=(-1); $ii=$ii-0.01){
      print "$ii\n";
     }
    De même dans l'autre sens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     for ($ii=-1; $ii<=1; $ii=$ii+0.01){
      print "$ii\n";
    Comment dois je faire ???
    -------------------
    Ickou

  2. #2
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Comment ça "perd la tête" ?
    Peux-tu préciser l'erreur ?

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  3. #3
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Petit problème de formatage de print sans doute. Ce code fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #!/usr/bin/perl
     
    $ii=1;
    while($ii>=-1){
      printf "%.2f\n",$ii;
      $ii=$ii-0.01;
     }
    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  4. #4
    Membre régulier Avatar de Ickou
    Inscrit en
    Avril 2005
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 174
    Points : 108
    Points
    108
    Par défaut
    tu as essayé d'excuter le code ???

    moi il donne ça :
    1
    0.99
    0.98
    0.97
    0.96
    etc ...
    0.47
    0.46
    0.45
    0.44
    0.429999999999999999
    0.419999999999999999 et après ça empire !!!!!!

    pourquoi il marque pas ça :
    0.43
    0.42
    etc....

    Je comprend pas pourquoi ça fait ça !!!!
    si tu vois pas ce que je veux dire, exécute le code et tu verras......

    Comment écrire le truc pour que ça marche ??
    -------------------
    Ickou

  5. #5
    Membre régulier Avatar de Ickou
    Inscrit en
    Avril 2005
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 174
    Points : 108
    Points
    108
    Par défaut
    ton code marche pour écrire à l'écran mais si je veux utiliser la variable $ii pour faire des calculs....
    deplus ça affiche pas le "-1"....

    on peut pas incrementer de 0.01 en perl sans qu'il fasse des erreurs :
    -------------------
    Ickou

  6. #6
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par Ickou
    tu as essayé d'excuter le code ???

    moi il donne ça :
    1
    0.99
    0.98
    0.97
    0.96
    etc ...
    0.47
    0.46
    0.45
    0.44
    0.429999999999999999
    0.419999999999999999 et après ça empire !!!!!!

    pourquoi il marque pas ça :
    0.43
    0.42
    etc....

    Je comprend pas pourquoi ça fait ça !!!!
    si tu vois pas ce que je veux dire, exécute le code et tu verras......

    Comment écrire le truc pour que ça marche ??
    Ce type de fonctionnement est tout à fait normal et inévitable.

    C'est dû au format utilisé pour stocker les nombres flottants, en binaire.

    0.01 ne doit pas être codable exactement, et c'est plus probablement un incrément de 0.0099999999 qui est employé, ou un truc du genre ... et finalement, au bout d'un moment, ça dérive.

    C'est pourquoi il est préférable d'utiliser un affichage formaté, limité aux décimales nécessaires.

    C'est ce qui impose, en analyse numérique, de ne pas tester une égalité à un nombre flottant, mais plutôt l'écart à ce nombre (qui doit être inférieur à un epsilon donné).


    Dans ton cas, plusieurs solutions sont possibles :

    1- Si les valeurs sont suffisamment correctes, à l'arrondi prêt, utiliser un printf pour les arrondir et avoir un affichage correct (masquer le problème, plutot que de le traiter)

    2- Traiter le problème dans un intervalle entier, et diviser ensuite la variable pour avoir la variation flottante voulue ($ii de -100 à 100, pas de 1, et division par 100 avant l'affichage)

    3- Utiliser des packages du CPAN destinés aux traitements mathématiques ... je ne sais plus lesquels, mais il y en a ...

    D'autres solutions, encore, sont certainement envisageables.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  7. #7
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par Ickou
    ton code marche pour écrire à l'écran mais si je veux utiliser la variable $ii pour faire des calculs....
    deplus ça affiche pas le "-1"....

    on peut pas incrementer de 0.01 en perl sans qu'il fasse des erreurs :
    Plutot que d'écrire à l'écran, tu peux aussi écrire dans une variable, au moyen de "sprintf"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $iii = sprintf ("%.2f",$ii); 
    print "$iii\n";
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  8. #8
    Membre régulier Avatar de Ickou
    Inscrit en
    Avril 2005
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 174
    Points : 108
    Points
    108
    Par défaut
    merci beaucoup

    j'ai finalement choisi la solution 2 que tu me proposais
    càd:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     for ($ii=-100; $ii<=100; $ii++){
     $nx=$ii/100;
      print "$nx\n";
     }
    je suis quand même un peu deçu de savoir que perl peut "bugger" sur certain truc ....

    mais bon, c'est super je vais pouvoir grace à vous continuer mon programme sans qu'il y ait des erreurs

    merci
    -------------------
    Ickou

  9. #9
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Ickou, as-tu essayé mon code ? Car c'est exactement ce que te suggère 2Eurocents.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  10. #10
    Membre régulier Avatar de Ickou
    Inscrit en
    Avril 2005
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 174
    Points : 108
    Points
    108
    Par défaut
    oui j'ai essayé ton code, il marche.... merci
    mais il ne faut pas oublier de faire le printf dans une nouvelle variable car l'erreur persiste dans la variable initiale.

    Le seul problème avec cette méthode, c'est qu'on va perdre la dernière valeur (-1) car le test est :
    or le -1 est en fait -1.0000001 donc passe pas le test....

    C'est pour cela que je préfère utiliser la méthode 2 de 2Eurocents, elle me semble plus "propre".

    je te remercie pour ton aide
    -------------------
    Ickou

  11. #11
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par Ickou
    je suis quand même un peu deçu de savoir que perl peut "bugger" sur certain truc ....
    Attention, ce n'est pas spécifique à Perl.

    Cela arrive dans de nombreux langages !

    C'est intrinsèque au codage des nombres en flottant. Ce problème survient plus ou moins vite selon le codage retenu (32 bits, 64 bits, 80 bits ...) ou ne survient pas du tout si l'on utilise des bibliothèques spécifiques : "précision arbitraire", ou bien "sans perte de précision", mais les calculs sont alors beaucoup plus lents.

    Sinon, dans le genre "expérience", je te recommande de tenter d'extraire la racine carrée d'une variable, puis la racine de celle-ci, etc. puis après de ré-élever au carré jusqu'à obtenir le nombre d'origine.

    En général, au bout de 5 ou 6 séries d'extractions/élévations, ça commence à diverger (et tous les langages sont touchés à différent titres !)
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  12. #12
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par GLDavid
    Ickou, as-tu essayé mon code ? Car c'est exactement ce que te suggère 2Eurocents.

    @++


    C'était, mais ce ne l'est plus depuis que j'ai corrigé ma faute de frappe et remplacé printf par sprintf (je rappelle que printf retourne le nombre de "formattages" réussis, et pas la chaine sortie, contrairement à sprintf).
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

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

Discussions similaires

  1. Problème Processus "perl.exe" Oracle 10g
    Par mugla dans le forum Installation
    Réponses: 2
    Dernier message: 11/12/2007, 10h19
  2. problème incrémentation en fonction d'une variable
    Par polo42 dans le forum VBA Access
    Réponses: 10
    Dernier message: 07/08/2007, 16h13
  3. petit problème variable perl bizzare
    Par Invité dans le forum Langage
    Réponses: 6
    Dernier message: 08/04/2006, 01h01
  4. problème avec perl Makefile.PL
    Par flores dans le forum Modules
    Réponses: 2
    Dernier message: 30/10/2005, 19h09
  5. Problème compatibilité PERL SH CSH
    Par minusette dans le forum Modules
    Réponses: 7
    Dernier message: 03/10/2005, 10h03

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