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 :

Nombre de décimal


Sujet :

MATLAB

  1. #1
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 93
    Points : 41
    Points
    41
    Par défaut Nombre de décimal
    Bonjour,

    je réalise des calculs avec Matlab et j'ai un petit problème quand au nombre de chiffre après la virgule. Matlab en affiche que 4. En utilisant le format long il peut en afficher 14.
    Ma question est comment fait-il les calculs ? Je crains qu'il ne tienne compte que de 4 décimales, même en utilisant un format long... Moi je veux garder le maximum de précision, comment faire ?

    Merci d'avance.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Bonjour,

    en théorie, si tu choisis dans les préférences le format long, les calculs se font sur l'ensemble des décimales.

    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
    22
    23
    24
     
    % Format long
    >> a=5.55555555555
    a =
                 5.55555555555
    >> b=4.4444444444
    b =
                  4.4444444444
    >> a*b
    ans =
              24.6913580244198
     
    % Format short
     
    >> a=5.55555555555
    a =
           5.5556
    >> b=4.4444444444
    b =
           4.4444
    >> c=a*b
    c =
           24.691
    >>

  3. #3
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 93
    Points : 41
    Points
    41
    Par défaut
    Merci pour cette réponse.

    Maintenant, si je veux afficher par exemple un premier résultat avec trois chiffres après la virgule puis un autre avec 5, .... quel commande écrire avant chaque résultat ?

    Merci

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Il suffit de faire ton arrondi "à la main" avant d'afficher le résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    a=5.555555555
    a =
                   5.555555555
    >> b=round(a*10^3)/10^3
    b =
                         5.556
    >> c=round(a*10^5)/10^5
    c =
                       5.55556
    La puissance de 10 te donnant l'arrondi après la virgule que tu souhaites. A toi de voir ensuite ce que tu dois utiliser entre les round, fix, floor, etc...

  5. #5
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 93
    Points : 41
    Points
    41
    Par défaut
    L'idée me semblait convenir mais quand j'essaie, j'obtiens "5.556000000...", cela doit venir que je suis en format long par defaut...

    Comment je peux faire ? Merci

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Tu as quoi comme format de préférence ? J'ai fait l'exemple précédent en utilisant "long g"

  7. #7
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 93
    Points : 41
    Points
    41
    Par défaut
    J'avais "long", je viens de mettre à "long g" mais toujours le même problème.

    Je pense pas faire quoi que ce soit de travers, je ne sais pas...

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    C'est bizarre ca...

    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
     
    % Format long
    >> a=5.55555555
    a =
       5.55555555000000
     
    %Bourrage avec des zéros
     
     
    % Format long g
    >> a=5.55555555
    a =
                    5.55555555
    % Pas de bourrage
    >>
    en attendant de trouver le truc, tu peux toujours convertir tes données en chaînes de caractères et ne récupérer que les x premiers éléments

  9. #9
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 93
    Points : 41
    Points
    41
    Par défaut
    J'ai réussi à faire marcher en tapant directement "format long g" dans les lignes de commande, il ne prenait pas en compte la modification du paramètres dans "préférences", étrange...

    Donc c'est très bien.

    Dernière question pour le moment.
    Si par exemple j'ai les résultats suivant : 5,5 / 5. 613 / 1.3158 / 1.488888
    Comment faire pour afficher : 5,500 / 5,613 / 1.316 / 1.489
    C'est à dire afficher toujours le même nombre de chiffre après la virgule en arrondissant...

    Si je convertis mes données en chaînes de caractères et ne récupère que les x premiers éléments, cela peut marcher mais je ne sais pas comment faire (désolé je suis débutant).
    N'existe-il pas une façon de faire plus simple, une fonction Matlab plus "académique" ?

    Merci pour vos idées.

  10. #10
    Membre confirmé
    Avatar de Dam2227
    Inscrit en
    Juin 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 343
    Points : 487
    Points
    487
    Par défaut
    Salut. Un petit tour par la fonction fprintf :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    >> a=5.5;
    >> b=5.613;
    >> c=1.316;
    >> d=1.488888;
    >> fprintf('%4.3f %4.3f %4.3f %4.3f',a,b,c,d)
    5.500 5.613 1.316 1.489>>
    ++
    Matlab 7.14.0.739 (R2012a)
    C/C++, python, R, SQL, Pig, MR

    Ma philosophie: Ne rien faire, mais le faire bien.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    L'ennui Dam avec ta méthode, c'est que tu n'as pas d'automatisation de l'affichage. Tu dois regarder à chaque fois combien de chiffre après la virgule tu as.

    Voici un code qui fait tout en automatique. Tu rentres juste ton vecteur à arrondir et la précision que tu veux.

    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
    22
    23
    24
    25
    26
    27
    28
    29
    a=[5.5 5.613 1.316 1.4888888];
     
    precision=3;
     
    for i=1:numel(a)
     
        b=num2str(a(i));
     
        if length(b)<precision+2
            c(1:precision+2-length(b))='0';
            b=[b c];
     
        elseif length(b)>precision+2
            b=str2num(b);
            b=round(a(i)*10^precision)/10^precision;
            b=num2str(b);
     
        end
        res(i)=cellstr(b);
     
    end
    res
    %%%%% Résultat
    res = 
        '5.500'    '5.613'    '1.316'    '1.489'
     
    res(1)
    ans = 
        '5.500'

  12. #12
    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
    Merel, ton code produit une chaine de caractères en sortie.

    On peux aussi faire simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    >> a=[5.5 5.613 1.316 1.4888888]
     
    a =
     
        5.5000    5.6130    1.3160    1.4889
     
    >> sprintf('%3.2f ', a)
     
    ans =
     
    5.50 5.61 1.32 1.49
    OU :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    >> a=5.5; b=5.613; c=1.316; d=1.4888888;
    >> sprintf('%3.2f ', [a b c d])
     
    ans =
     
    5.50 5.61 1.32 1.49 
     
    >>
    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 !

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Heu non, en sortie, j'ai des cellules contenant chacune des valeurs de a

    Pour ma défense, je dirais que si Stick veut seulement afficher une de ces valeurs, il les a directement dans chaque cellules de res. Il a juste à faire res(2) pour la deuxième valeur.

    Et il peut très bien utiliser un petit cell2mat pour mettre la valeur de res en chaîne de caractères.

    En utilisant vos méthodes respectives, si il veut la deuxième valeur de a, il doit faire b(6:9) si je ne me trompe pas. (si b=sprintf('%3.2f ', a))

  14. #14
    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 : 52 884
    Points
    52 884
    Par défaut
    J'arrive un peu tard mais peut-on savoir quel est le but de toute cette gymnastique syntaxique ?
    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)

  15. #15
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    Le nombre de chiffres significatifs ne dépend pas de Matlab mais de ton processeur qui applique la norme ANSI/IEEE 754
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

Discussions similaires

  1. [Nombre]formater le nombre de décimal après une virgule.
    Par PascalCmoa dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 09/03/2007, 10h40
  2. Définir un nombre de décimales
    Par IDE dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 11/01/2006, 17h52
  3. Comment fixer le nombre de décimal !
    Par Paul1804 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 09/01/2006, 15h12
  4. définir nombre de décimale
    Par capone dans le forum C++Builder
    Réponses: 5
    Dernier message: 08/01/2006, 14h15
  5. round avec nombre de décimale spécifiée
    Par bilb0t dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 14/04/2005, 16h44

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