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

MATLAB Discussion :

Matlab qui "change mes valeurs", problème de format? [Débutant]


Sujet :

MATLAB

  1. #1
    Membre du Club
    Homme Profil pro
    Post-Doc Ecologie
    Inscrit en
    Juillet 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Taïwan

    Informations professionnelles :
    Activité : Post-Doc Ecologie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2007
    Messages : 76
    Points : 45
    Points
    45
    Par défaut Matlab qui "change mes valeurs", problème de format?
    Bonjour à tous,

    Je poste ici, un problème ou plutôt une question.

    Je demande à matlab (version 7.6.0.324 mais pareil sur Matlab version 5.2.0.3084), de me créer une matrice d'une seule colonne et de la remplir de valeurs. Je lui indique (il me semble) les valeurs que je veux.

    Pourtant, certaines des valeurs que je retrouve dans cette matrice colonne, diffèrent de celles que j'avais demandées.

    Concrètement voilà mon code :
    Je créer un vecteur que je veux remplir (ici de longitudes) allant de -110 à 70 avec un incrément de 0.2 degrés. Matlab me le crée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >> whos
      Name        Size            Bytes  Class     Attributes
     
      a         901x1              7208  double
    A mon sens, les valeurs inclues dans "a" seraient par exemple:
    -110
    -109.8
    -109.6
    ...

    Ce qu'elles sont en fait pour une grosse partie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    a(1:3)
     
    ans =
     
      1.0e+002 *
     
      -1.100000000000000
      -1.098000000000000
      -1.096000000000000
    Mais pas pour toute.Si je tape:j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ans =
     
     -74.199999999999989
    Au lieu de -74.2, et ceci que ce soit le format long ou format short. Disons qu'en format short j'ai un chiffre arrondi, donc je ne m'en étais pas rendu compte tout de suite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >> format short
    >> a(180)
     
    ans =
     
      -74.2000
    Mais après un test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    a(180)==-74.2
     
    ans =
     
         0
    Il semblerait que ma valeur, que je voulais égale à -74.2 ne l'est pas...

    Quelqu'un a une idée de pourquoi Matlab fait ça?
    J'ai cherché dans le forum, du côté des "arrondis" mais je n'ai pas vraiment trouvé d'éléments de réponse.

  2. #2
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Matlab 5.2

    Réponse dans la
    Pourquoi 0.3-0.2-0.1 est-il différent de 0 ?

    Même si le titre parait loin de ta question

    Et MATLAB n'y est pour rien le pauvre.
    Règles du Forum

    Adepte de la maïeutique

  3. #3
    Membre du Club
    Homme Profil pro
    Post-Doc Ecologie
    Inscrit en
    Juillet 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Taïwan

    Informations professionnelles :
    Activité : Post-Doc Ecologie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2007
    Messages : 76
    Points : 45
    Points
    45
    Par défaut
    Cool Merci Caro-Line

    Dans la FAQ... Pourtant j'y passe régulièrement, mais j'avoue "virgule flottante", n'avait pas attiré mon attention.

    C'est pile les soucis quand on lit dans la FAQ:
    "Il est nécessaire d'être particulièrement vigilant lorsque des tests logiques d'égalité sont effectués sur ces nombres.

    A ma décharge, hier soir (je me suis pris la tête avec des test logiques pendant une partie de la soirée), je n'avais pas internet Donc pas de FAQ (hum hum je m'en sortirai comme ça...)

    Donc si je peux redonner un conseil (déjà donner par Caro-Line, Dut et tant d'autres), aller toujours toujours voire la FAQ


    et oui je travaille toujours de temps à autre avec Matlab 5...
    Encore Merci Caro

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    Bonjour.
    Une autre solution ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    clear
    a=(-110:2e-1:70)';
    a1=(floor((-110:2e-1:70)*100)/100)';
    a(180)
    a1(180)
    a(180)+74.2
    a1(180)+74.2

  5. #5
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonsoir,

    Pour enrichir d'avantage les solutions proposées.

    a = -110 à 70 avec un pas de 0.2 => 70-(-110) = 180

    le nombre d'éléments du vecteur a est de : 180/0.2 = 900

    Ma solution :

    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
    18
    19
    20
    21
     
    >> a=linspace(-110, 70, 900) ;
    >> numel(a)
     
    ans =
     
       900
     
    >> max(a)
     
    ans =
     
        70
     
    >> min(a)
     
    ans =
     
      -110
     
    >>
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Citation Envoyé par kmaniche Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    >> a=linspace(-110, 70, 900) ;
    Euh... plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a=linspace(-110, 70, 901) ;
    Mais ce qui ne change (presque) rien au problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >> a=linspace(-110, 70, 901) ;
    >> a(180)
     
    ans =
     
      -74.2000
     
    >> sprintf('%.15f',a(180))
     
    ans =
     
    -74.200000000000003
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    On peux régler avec Format
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Ce n'est pas uniquement une question d'affichage...

    L'outil informatique a des limites qu'il est bon d'avoir en tête lorsqu'on programme

    Maintenant, ce n'est pas non plus une raison pour conclure que tous les calculs sont faux... ils sont simplement justes à une précision donnée.
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  9. #9
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Citation Envoyé par Dut Voir le message

    L'outil informatique a des limites qu'il est bon d'avoir en tête lorsqu'on programme
    Exacte.
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  10. #10
    Membre du Club
    Homme Profil pro
    Post-Doc Ecologie
    Inscrit en
    Juillet 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Taïwan

    Informations professionnelles :
    Activité : Post-Doc Ecologie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2007
    Messages : 76
    Points : 45
    Points
    45
    Par défaut
    Pour revenir à la solution de Phryte
    Bonjour.
    Une autre solution ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    clear
    a=(-110:2e-1:70)';
    a1=(floor((-110:2e-1:70)*100)/100)';
    a(180)
    a1(180)
    a(180)+74.2
    a1(180)+74.2
    Effectivement ça fonctionne pour 74.2 mais pas pour tous, par exemple pour 74.4:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    a(179)-74.4
     
    ans =
     
       -1.488000000000000e+002
     
    a1(179)-74.4
     
    ans =
     
       -1.488100000000000e+002

    Donc pour mes tests logiques ça marche pas, je passe par des "valeurs proches" comme expliquées dans la FAQ. Et garder en tête cette limitation.
    Comme disait Dut
    justes à une précision donnée
    En tous cas merci à tous pour vos réponses

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/04/2007, 13h22
  2. Chaine de caractère qui change de valeur
    Par HaTnuX dans le forum C
    Réponses: 7
    Dernier message: 03/12/2006, 23h58
  3. booléan qui change de valeur debug/release
    Par crealinks dans le forum MFC
    Réponses: 3
    Dernier message: 18/08/2006, 17h09
  4. Quotes sur des valeurs numériques
    Par shadeoner dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 05/05/2006, 14h56
  5. quote dans des valeurs d'une colonne SET
    Par Jean Fi dans le forum Requêtes
    Réponses: 6
    Dernier message: 30/03/2006, 20h16

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