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

Shell et commandes GNU Discussion :

Faire une division et afficher le résultat complet (trois chiffres après la virgule)


Sujet :

Shell et commandes GNU

  1. #1
    Candidat au Club
    Femme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2022
    Messages : 2
    Par défaut Faire une division et afficher le résultat complet (trois chiffres après la virgule)
    je suis débutante en shell et je voudrais faire une division et afficher le resultat complet ( trois chiffre après la virgule)
    voici ce que j'ai écris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let "j=214646"
    let "y=1000"
    x=`echo "$j/$y" | bc -l`

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    Bonjour,

    1. ici, let ne sert à rien.
    2. les backticks (`) ne sont plus utilisées depuis ... ..
    3. lis le man bc, et cherche scale.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 374
    Par défaut
    mouais, bc pour une division alors qu'un printf suffit...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    j=214646
    y=1000
    printf '%d.03d\n' $((j/y)) $(((j*1000/y)%1000))
    Bon, ok, cette version ne fonctionne qu'avec j et y des entiers.

  4. #4
    Candidat au Club
    Femme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2022
    Messages : 2
    Par défaut
    bonsoir,

    je ne peut pas utiliser bc car je reçois l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bash: bc: command not found
    (j'utilise git bash)
    j'ai aussi essayer awk et ça marche pas je reçoit l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk: cmd. line:1: fatal: division by zero attempted
    j'ai essayer ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    printf '%d.03d\n' $((j/y)) $(((j*1000/y)%1000))
    214.03d
    646.03d
    mais je reçoit pas le resultat, ça divise la variable j en deux. je veut juste appliquer une division j/y et avoir un résultat décimal complet car si j'écrit je reçoit seulement 214.

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ awk -v j=$j -v y=$y 'BEGIN{printf("%.3f\n", j/y)}'                                                                                                                                                                       
    0.331
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 374
    Par défaut
    ouais mais bon, j'ai fais une erreur, j'ai oublié un %:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf '%d.%03d\n' $((j/y)) $(((j*1000/y)%1000))
    Mais, bon, c'était remarquable

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf '%d.%03d\n' $((j/y)) $(((j*1000/y)%1000))
    Jolie formule (remarquable) !

    À noter toutefois qu'elle a tendance à tronquer plutôt qu'arrondir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ a=22; b=7; printf '%d.%03d\n' $((a/b)) $(((a*1000/b)%1000))
    3.142
    $ a=22; b=7; printf '%d.%03d\n' $((a/b)) $(((a*1000000/b)%1000000))
    3.142857
    et qu'elle ne gère pas très bien les nombres négatifs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ a=22; b=-7; printf '%d.%03d\n' $((a/b)) $(((a*1000000/b)%1000000))
    -3.-142857
    Quant à la LOCALE, n'en parlons pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ awk -v a=22 -v b=-7 'BEGIN{printf("%.3f\n", a/b)}' 
    -3,143
    D'ailleurs, le titre n'indique-t-il pas "trois chiffres après la virgule" ?

    Qui a dit que je pinaillais ?

    [EDIT] corrige 3/7 en 22/7 (merci Disedorgue)

    [re-EDIT] corrige 7 en -7 (re-merci Disedorgue)

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 374
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Jolie formule (remarquable) !

    À noter toutefois qu'elle a tendance à tronquer plutôt qu'arrondir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ a=22; b=7; printf '%d.%03d\n' $((a/b)) $(((a*1000/b)%1000))
    3.142
    $ a=22; b=7; printf '%d.%03d\n' $((a/b)) $(((a*1000000/b)%1000000))
    3.142857
    et qu'elle ne gère pas très bien les nombres négatifs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ a=22; b=-7; printf '%d.%03d\n' $((a/b)) $(((a*1000000/b)%1000000))
    -3.-142857
    Quant à la LOCALE, n'en parlons pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ awk -v a=3 -v b=7 'BEGIN{printf("%.3f\n", a/b)}' 
    -3,143
    D'ailleurs, le titre n'indique-t-il pas "trois chiffres après la virgule" ?

    Qui a dit que je pinaillais ?

    une version corrigé, qui corrige le potentiel '-' pour la partie flottante avec en plus prise en compte de la locale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf "%d$(locale decimal_point)%03d\n" $((j/y)) $(((${j#-}*1000/${y#-})%1000))
    PS: à priori, ton awk a des problèmes de calcul (3/7=-3,143 )

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    une version corrigé, qui corrige le potentiel '-' pour la partie flottante avec en plus prise en compte de la locale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf "%d$(locale decimal_point)%03d\n" $((j/y)) $(((${j#-}*1000/${y#-})%1000))
    Génial ! (et le mot est faible...)

    PS: à priori, ton awk a des problèmes de calcul (3/7=-3,143 )
    Pourtant mon awk est tout neuf:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ awk --version
    awk version 20070501
    En fait, c'était une erreur de recopie ! j'ai corrigé. Merci.

    [EDIT] mais pas très bien corrigé....

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    tout neuf ! en 2007.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 374
    Par défaut
    Maintenant ton awk calcul bien mais de façon négative (22/7= -3,143)
    C'est peut-être N_BaH qui l'a vexé

  12. #12
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 154
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 154
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Maintenant ton awk calcule bien mais de façon négative (22/7= -3,143)
    Ben j'ai pas trouvé, moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ j=22; y=7; printf "%d$(locale decimal_point)%03d\n" $((j/y)) $(((${j#-}*1000/${y#-})%1000))
    3,142

  13. #13
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 374
    Par défaut
    Moi, ce que je vois c'est que la division de deux nombres positifs donne un nombre négatif...

    Mais si tu parles de l'arrondi, c'est plutôt subjectif car personnellement, j'ai du mal avec ce genre de résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ awk -v a=19998 -v b=10000 'BEGIN{printf("%.3f\n", a/b)}'
    2.000

  14. #14
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    ça fait bizarre, mais si je me souviens bien de mes cours élémentaires, c'est la règle pour un arrondi : au-dessus de cinq, on arrondit à la dizaine supérieure.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 374
    Par défaut
    Et oui, et donc sous bash, rien que de faire:
    serait donc faux ?

  16. #16
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    "Faux" ?! Quel grand mot !

    Je dirais plutôt "approximatif"...

    Je vous invite à revoir vos cours sur la division...

    Je me souviens: en 98, combien de fois 10 ? Il y va 9 fois et il reste 8 !

    Dans la division euclidienne (ou entière), si b != 0, il existe une décomposition unique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = b*q + r où 0 <= r < q
    Comme bash ne traite que des entiers, j'imagine qu'il doit suivre scrupuleusement la division euclidienne (au moins pour les nombres entiers) et donner le quotient euclidien, c'est-à-dire la valeur tronquée du quotient réel, qui, dans certains cas, peut être différente de la valeur arrondie.

    D'ailleurs, il existe certains langages (comme le_lisp) où "la" division est implémentée sous forme de différentes fonctions (/, div, divide, truncate, round), chacune avec une spécification bien précise (division euclidienne, division arrondie, division "réelle" (avec les limites des floats, bien sûr), etc.).

  17. #17
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Mais si tu parles de l'arrondi, c'est plutôt subjectif car personnellement, j'ai du mal avec ce genre de résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ awk -v a=19998 -v b=10000 'BEGIN{printf("%.3f\n", a/b)}'
    2.000
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ awk -v a=19998 -v b=10000 'BEGIN{printf("%.3f\n", a/b)}'
    2,000
     
    $ awk -v a=19998 -v b=10000 'BEGIN{printf("%.4f\n", a/b)}'
    1,9998
    Ce qui est subjectif, c'est ton ressenti face à ce résultat, car, objectivement, si le résultat "exact" est 1,9998, il est clair que c'est beaucoup plus proche de 2,000 que de 1,999. En effet, la différence due à l'approximation est, dans le 1er cas: 0,0002 et, dans le 2ème: 0,0008 (qui est 4 fois plus grand), CQFD.

  18. #18
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Et oui, et donc sous bash, rien que de faire:
    serait donc faux ?
    oui.
    quand on demande un résultat décimal, ce résultat est faux.
    et quand on retourne un arrondi comme résultat d'une division qu'on veut "exhaustive"/exacte, le résultat est également erroné.

    le problème n'est pas "ce qu'on obtient", mais "ce qu'on obtient par rapport à ce qu'on a demandé" !

    on demande un "arrêt" après un certain nombre de décimales, et il faut une indication de la tendance du résultat :
    le résultat tend-il vers le nombre supérieur, ou
    le résultat tend-il vers nombre inférieur
    c'est ce qu'indique l'arrondi : 3.1416

    et PI c'est tout.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  19. #19
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 374
    Par défaut
    Bon, ok....

    une version corrigée en bash:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ j=22
    $ y=-7
    $ printf "%.3f\n" $((j/y))$(locale decimal_point)$(((${j#-}*10000000000000/${y#-})%10000000000000))
    -3.143

Discussions similaires

  1. Afficher un double avec 2 chiffres après la virgule
    Par luilui dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 08/12/2010, 18h19
  2. [Débutant] afficher valeurs numériques avec deux chiffres après la virgule
    Par bahja29 dans le forum MATLAB
    Réponses: 4
    Dernier message: 07/04/2009, 11h48
  3. Réponses: 4
    Dernier message: 06/12/2007, 20h23
  4. Faire une division entre deux chiffres?
    Par shun dans le forum Langage SQL
    Réponses: 9
    Dernier message: 09/09/2005, 16h37
  5. Comment faire une division par 5 avec les decalages
    Par Zaion dans le forum Assembleur
    Réponses: 7
    Dernier message: 05/11/2004, 17h33

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