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 :

Méthode de Calcul d'exponentiel


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut Méthode de Calcul d'exponentiel
    Bonsoir à tous,
    j'ai un programme en shell qui utilise des valeur données sous la forme exponentielle. Je vois pas comment faire pour les rendre comprehensible par le compli.
    Est ce qu'il ya une formule pour les calculer par exemple?
    Une idée svp?
    merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Quelles sont les erreurs que tu as rencontrées?
    Quel est le code que tu as implémenté?

  3. #3
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    merci Mygale pour votre reponse,
    mais là un ami ma dit de faire cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ echo "2 * e (2)" | bc -l 14.77811219786130045446
    J'ai pas trop compri comment faire
    merci

  4. #4
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Salut.

    La valeur exp(1) approche de 2.718281828459 ... pour avoir une valeur approchée de exp(x), il faut élever exp(1) à la puissance x.

    Après Sh et Bash ne gèrent pas comme ça les nombres à virgule flottante il faut s'arranger comme ceci par exemple :

    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
    #!/bin/sh
    ExPow () # fonction qui va élever exp (1) à la puissance x
    {
        exp=$(echo "(1*2.718281828459)" | bc) # moyen pour affecter une valeur à virgule flottante
        value=1
        for (( i=1 ; i<=x ; i++ ))
        do
            value=$(echo "$value*$exp" | bc -l) # moyen pour calculer une opération où interviennent des nombres à virgule flottante
        done
    }
    
    if [ $# -eq 0 ] # s'il n'y a pas de paramètres
    then
        printf "Calcul de exp(x), saisir x : "
        read x
    else # sinon
        x=$1 # x prend la valeur du premier paramètre
    fi
    ExPow
    echo $value
    Tu peut adapter cette fonction ExPow () pour ton code.

  5. #5
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Merci beaucour Idrissi
    mais seulement là je bloque comment integrer cette fonction dans mon code qui fait le sort d'un fichier http://www.developpez.net/forums/d84...n-langage-awk/
    une idée svp?
    merci

  6. #6
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Très bien, si j'ai bien compris, tu as un fichier standard qui se présente comme ceci :

    insister->to put -3.553851e-05
    insister->to vote -7.547198e-06
    insister->to respect -1.091798e-05
    joindre->to join -2.994884e-06
    joindre->to alter 2.090002e-06
    Tu veut récupérer les valeurs à la fin de chaque lignes, c'est bien ça ? Tu veut en faire quoi ? Simplement les afficher ?

    Edit : ah non, tu veut les trier en ordre décroissant puis les afficher, c'est bien ça ?

  7. #7
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    oui je veux trier chaque bloc selon la valeur par ordre decroissant
    c'est à dire je trie les regles commencant pas "insister" ensemble par ordre decroissant et les autre commencant par "joindre" ensemble

  8. #8
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Re,

    J'ai développé une solution pas très optimisée sans doute ...

    Voici comment j'ai procédé :
    - lecture du fichier ligne par ligne dans une boucle
    - interprétation et calcul des valeurs de la dernière colonne et enregistrement dans un tableau mono dimensionnel
    - enregistrement des lignes du fichier dans un tableau mono dimensionnel
    - tri à bulle
    - boucle until pour inverser l'ordre
    - utilisation de grep tout à la fin pour ordonner les fichier comme tu le souhaites

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    #!/bin/bash
     
    fichier=xwp
    fichier2=xwp2
    declare -a tab tab2
    touch xwp2
     
    ExPow ()
    {
        exp=$(echo "(1*2.718281828459)" | bc) 
        value=1
     
        if [ $x -lt 0 ]
        then
            x2=$(echo $x | awk 'BEGIN{FS="-"} {print $2}')
        else
            x2=$x
        fi
     
        for (( i=1 ; i<=$x2 ; i++ ))
        do
            value=$(echo "$value*$exp" | bc -l)
        done
        if [ $x -lt 0 ]
        then
            value=$(echo "1/$value" | bc -l)
        fi
    }
    k=0
     
    cat $fichier | while true
    do
        read ligne
        if [ "$ligne" = "" ]
        then
            # tri à bulle
            for (( m=0 ; m<k ; m++ ))
            do
                let k2=$k-$m
                for (( n=0 ; n<k2 ; n++ ))
                do
                    comp=$(echo "${tab[n]} < ${tab[m]}" | bc)
                    if [ $comp -eq 1 ]
                    then
                        tampon1=${tab[m]}
                        tampon2=${tab2[m]}
     
                        tab[m]=${tab[n]}
                        tab2[m]=${tab2[n]}
     
                        tab[n]=$tampon
                        tab2[n]=$tampon2
                    fi
                done
                until [ $k -eq 0 ]
                do
                    let k=$k-1
                    echo ${tab2[k]} >> $fichier2
                done
     
            done
            exit
        else
            set -- $ligne
            x=$(echo $3 | awk 'BEGIN{FS="e"} {print $2}')
            value2=$(echo $3 | awk 'BEGIN{FS="e"} {print $1}')
            x=$(echo "$x" | bc -l)
            ExPow
            tab[k]=$(echo "$value*$value2" | bc -l)
            tab2[k]=$(echo $ligne)
            let k=$k+1    
        fi
        let SIZE=$k+1
    done
     
    rm $fichier
    cat $fichier2 | grep insister > $fichier
    cat $fichier2 | grep joindre >> $fichier
    rm $fichier2

  9. #9
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Merci Beaucoup Idrisse c'est gentil de votre part
    seulemnt me reste un truc : là apres le sort on va selectionner seulement les 100 premieres triggers( par ordre decroissant).

  10. #10
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    J'ai modifié un peu le code car il triait dans l'ordre croissant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    seulemnt me reste un truc : là apres le sort on va selectionner seulement les 100 premieres triggers( par ordre decroissant).
    donc ton fichier de départ est en fait plus grand, et tu veut n'avoir que les 100 premières lignes du fichier de sortie actuel ?

  11. #11
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Citation Envoyé par ok.Idriss Voir le message
    J'ai modifié un peu le code car il triait dans l'ordre croissant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    seulemnt me reste un truc : là apres le sort on va selectionner seulement les 100 premieres triggers( par ordre decroissant).
    donc ton fichier de départ est en fait plus grand, et tu veut n'avoir que les 100 premières lignes du fichier de sortie actuel ?
    oui un tres gros fichier de taille de 3 GO

  12. #12
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Citation Envoyé par ok.Idriss Voir le message
    Re,

    J'ai développé une solution pas très optimisée sans doute ...

    Voici comment j'ai procédé :
    - lecture du fichier ligne par ligne dans une boucle
    - interprétation et calcul des valeurs de la dernière colonne et enregistrement dans un tableau mono dimensionnel
    - enregistrement des lignes du fichier dans un tableau mono dimensionnel
    - tri à bulle
    - boucle until pour inverser l'ordre
    - utilisation de grep tout à la fin pour ordonner les fichier comme tu le souhaites

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    #!/bin/bash
     
    fichier=xwp
    fichier2=xwp2
    declare -a tab tab2
    touch xwp2
     
    ExPow ()
    {
        exp=$(echo "(1*2.718281828459)" | bc) 
        value=1
     
        if [ $x -lt 0 ]
        then
            x2=$(echo $x | awk 'BEGIN{FS="-"} {print $2}')
        else
            x2=$x
        fi
     
        for (( i=1 ; i<=$x2 ; i++ ))
        do
            value=$(echo "$value*$exp" | bc -l)
        done
        if [ $x -lt 0 ]
        then
            value=$(echo "1/$value" | bc -l)
        fi
    }
    k=0
     
    cat $fichier | while true
    do
        read ligne
        if [ "$ligne" = "" ]
        then
            # tri à bulle
            for (( m=0 ; m<k ; m++ ))
            do
                let k2=$k-$m
                for (( n=0 ; n<k2 ; n++ ))
                do
                    comp=$(echo "${tab[n]} < ${tab[m]}" | bc)
                    if [ $comp -eq 1 ]
                    then
                        tampon1=${tab[m]}
                        tampon2=${tab2[m]}
     
                        tab[m]=${tab[n]}
                        tab2[m]=${tab2[n]}
     
                        tab[n]=$tampon
                        tab2[n]=$tampon2
                    fi
                done
                until [ $k -eq 0 ]
                do
                    let k=$k-1
                    echo ${tab2[k]} >> $fichier2
                done
     
            done
            exit
        else
            set -- $ligne
            x=$(echo $3 | awk 'BEGIN{FS="e"} {print $2}')
            value2=$(echo $3 | awk 'BEGIN{FS="e"} {print $1}')
            x=$(echo "$x" | bc -l)
            ExPow
            tab[k]=$(echo "$value*$value2" | bc -l)
            tab2[k]=$(echo $ligne)
            let k=$k+1    
        fi
        let SIZE=$k+1
    done
     
    rm $fichier
    cat $fichier2 | grep insister > $fichier
    cat $fichier2 | grep joindre >> $fichier
    rm $fichier2
    Merci Idriss, mais là je vois pas à quel niveau du code je precise mon fichier texte input

  13. #13
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Dans ce cas tu n'a cas modifier la boucle until :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    #!/bin/bash
     
    fichier=xwp
    fichier2=xwp2
    declare -a tab tab2
    touch xwp2
     
    ExPow ()
    {
        exp=$(echo "(1*2.718281828459)" | bc) 
        value=1
     
        if [ $x -lt 0 ]
        then
            x2=$(echo $x | awk 'BEGIN{FS="-"} {print $2}')
        else
            x2=$x
        fi
     
        for (( i=1 ; i<=$x2 ; i++ ))
        do
            value=$(echo "$value*$exp" | bc -l)
        done
        if [ $x -lt 0 ]
        then
            value=$(echo "1/$value" | bc -l)
        fi
    }
    k=0
     
    cat $fichier | while true
    do
        read ligne
        if [ "$ligne" = "" ]
        then
            # tri à bulle
            for (( m=0 ; m<k ; m++ ))
            do
                let k2=$k-$m
                for (( n=0 ; n<k2 ; n++ ))
                do
                    comp=$(echo "${tab[n]} < ${tab[m]}" | bc)
                    if [ $comp -eq 1 ]
                    then
                        tampon1=${tab[m]}
                        tampon2=${tab2[m]}
     
                        tab[m]=${tab[n]}
                        tab2[m]=${tab2[n]}
     
                        tab[n]=$tampon
                        tab2[n]=$tampon2
                    fi
                done
            l=0
                until [ $k -eq 0 ] || [ $l -eq 100 ]
                do
                    let k=$k-1
                    echo ${tab2[k]} >> $fichier2
            let l=$l+1
                done
     
            done
            exit
        else
            set -- $ligne
            x=$(echo $3 | awk 'BEGIN{FS="e"} {print $2}')
            value2=$(echo $3 | awk 'BEGIN{FS="e"} {print $1}')
            x=$(echo "$x" | bc -l)
            ExPow
            tab[k]=$(echo "$value*$value2" | bc -l)
            tab2[k]=$(echo $ligne)
            let k=$k+1    
        fi
        let SIZE=$k+1
    done
     
    rm $fichier
    cat $fichier2 | grep insister > $fichier
    cat $fichier2 | grep joindre >> $fichier
    rm $fichier2
    Si quelqu'un à mieux (plus court comme code) ... mais bon il devrait fonctionner. Si tu as des questions dessus n'hésites pas.

    Attention toutefois :
    - il trie le tout dans l'ordre décroissant (en fonction du nombre de la troisième colonne)
    - il prend les 100 premiers
    - il classe en fonction de la mention "insister" ou "joindre"

  14. #14
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    MErci bien,
    donc là si j'ai bien compri
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat $fichier | while true
    je precise bien le chemin du fichier d'entrée c'est bien ca?

  15. #15
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Non la tu laisse tel quel, c'est tout au début :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fichier=xwp
    fichier2=xwp2
    Que tu spécifies le nom des fichiers (ou le chemin s'ils ne sont pas dans le même répertoire que le script). Tu peut aussi faire une saisie ou les mettre en paramètres si tu veut ...

    xwp était le nom de ton fichier. xwp2 est le nom du fichier intermédiaire (tu peut les modifier si tu veut).

    Attention : le fichier de sortie est le fichier d'entrée (fichier2 est un fichier intermédiaire).

  16. #16
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Ah d'accord merci

  17. #17
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Là il m'affiche deux erreurs !
    declare : not found

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       for ( i=1 ; i<=$x2 ; i++ )
    Syntax error: Bad for loop variable
    Une idée svp?

  18. #18
    Invité
    Invité(e)
    Par défaut
    Salut,

    for (( expr1 ; expr2 ; expr3 )) ; do list ; done
    First, the arithmetic expression expr1 is evaluated according to the rules described below under ARITHMETIC EVALUATION. The arithmetic
    expression expr2 is then evaluated repeatedly until it evaluates to zero. Each time expr2 evaluates to a non-zero value, list is executed
    and the arithmetic expression expr3 is evaluated. If any expression is omitted, it behaves as if it evaluates to 1. The return value is
    the exit status of the last command in list that is executed, or false if any of the expressions is invalid.

  19. #19
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Bonsoir,
    mais les mêmes erreurs persistent encore

  20. #20
    Invité
    Invité(e)
    Par défaut
    Merci de poster l'entiereté de ton code afin d'en avoir une vue globale.

Discussions similaires

  1. Réponses: 18
    Dernier message: 23/08/2010, 16h44
  2. Réponses: 0
    Dernier message: 16/07/2009, 17h15
  3. Méthode de calcul d'un échantillon représentatif
    Par auredura dans le forum SAS STAT
    Réponses: 5
    Dernier message: 24/04/2009, 19h12
  4. [débutant]problème pour calculer une exponentielle
    Par sissi25 dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 11/10/2008, 20h43
  5. Calculer un exponentiel
    Par Bossju dans le forum VB.NET
    Réponses: 1
    Dernier message: 07/02/2007, 19h16

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