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

C Discussion :

Dichotomie pour une racine carrée


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 63
    Points : 40
    Points
    40
    Par défaut Dichotomie pour une racine carrée
    Bonsoir tous,

    Voilà, vous connaissez probablement le principe, pas besoin de s'étaler dessus ! Par contre pour le mettre sur C, c'est autre chose :


    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
     
    float m, x, a, b;
        double e;
     
        do
            {
                scanf("%f",&x);
            }while(x<0); // tester en donnant un x<0
     
        do
            {
                scanf("%f",&e);
            }while(e<0); // tester en donnant un e<0
     
     
     
        if(x>1)
            {
                a=1;
                b=x;
            }
        else
            {
                a=x;
                b=1;
            }
     
        m=(a+b)/2;
     
       while ( b-a>e)
            {
                if (x>m*m) a=m;
                else b=m;
            }
     
        printf(" racine x = %f", m);
    -> je compile avec x=1 et e=1 et ça donne racine=1.000
    -> je compile avec x=1 et e=0.1 , racine=1.000
    -> x=2 et e=1, il coince (affiche le programme, mais une fois il prend e, il fait plus rien !).

    C'est quoi le problème à votre avis ?

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

    Relis le manuel de scanf : ce n'est pas avec %f qu'on lit un double.

    Aussi, dans la boucle while, tu ne modifie jamais la valeur de m.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while ( b-a>e)
    {
        if (x>m*m) a=m;
        else b=m;
    }
    Peux tu nous donner l'algorithme que tu utilises ?

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par mabu Voir le message
    Bonjour,

    Relis le manuel de scanf : ce n'est pas avec %f qu'on lit un double.

    Aussi, dans la boucle while, tu ne modifie jamais la valeur de m.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while ( b-a>e)
    {
        if (x>m*m) a=m;
        else b=m;
    }
    Peux tu nous donner l'algorithme que tu utilises ?
    Je mets %e mais ça ne change rien !

    Le voilà l'algo :

    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
    Début
    
    Répéter
      lire(x)
    jusqu'à (x>=0)
    
    Répéter
      lire(e)
    jusqu'à (e>0)
    
    si x>1 alors 
      x<-1
      b<-x
    
    sinon
      a<-x
      b<-1
    
    m<-(a+b)/2
    
    tant que b-a>e faire
                si x>m*m alors a<-m
                sinon b<-m
    
    afficher(m)

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par bounadalvidal Voir le message
    Je mets %e mais ça ne change rien !
    Il fallait mettre "%lf".


    Citation Envoyé par bounadalvidal Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    m<-(a+b)/2
    tant que b-a>e faire
                si x>m*m alors a<-m
                sinon b<-m
    afficher(m)
    1- tu calcules m.

    2- tu fais une boucle dans laquelle m n'est pas modifié.

    3- tu affiches m : problème il n'a pas été modifié par la boucle.

    Iil faut mettre le calcul de m dans la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    tant que b-a>e faire
                m<-(a+b)/2
                si x>m*m 
                alors 
                    a<-m
                sinon 
                    b<-m
    afficher(m)

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    Bon voilà le code final auquel j'aboutis et qui ne fonctionne pas !

    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
     
     float m, x, a, b, e;
     
        do
            {
                scanf("%lf",&x);
            }while(x<0); // tester en donnant un x<0
     
        do
            {
                scanf("%lf",&e);
            }while(e<0); // tester en donnant un e<0
     
     
     
        if(x>1)
            {
                a=1;
                b=x;
            }
        else
            {
                a=x;
                b=1;
            }
     
     
     
       while ( b-a>e)
            {
                m=(a+b)/2;
                if (x>m*m) a=m;
                else b=m;
            }
     
        printf(" racine x = %lf", m);

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Bonsoir,

    %f pour les float
    %lf pour les double.

    attention aux types dans les opération :

    m = (a+b) / 2; donne un résultat entier, donc tronqué

    m = (a+b) / 2. ;donne un résultat flottant (ce qui t'intéresse)

    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
    #include <stdio.h>
    int main(void)
    {
        double m, x, a, b, e;
     
        do {
            scanf("%lf", &x);
        } while (x < 0);
        //tester en donnant un x < 0
     
        do {
            scanf("%lf", &e);
        } while (e < 0);
        //tester en donnant un e < 0
     
     
     
        if (x > 1) {
            a = 1;
            b = x;
        } else {
            a = x;
            b = 1;
        }
     
     
     
        while (b - a > e) {
            m = (a + b) / 2.;
            if (x > m * m)
                a = m;
            else
                b = m;
     
        }
     
     
        printf(" racine %lf = %lf\n", x, m);
        return 0;
    }
    EDIT : n'hésite pas à utiliser un débogueur pas à pas pour comprendre le fonctionnement de ton programme (ça permet par exemple de voir l'évolution des variables)

  7. #7
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    Ok, merci, ça marche

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

Discussions similaires

  1. Comprendre mon exercice : formule récurrente de calcul d'une racine carrée
    Par djmhdi dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 15/01/2015, 18h30
  2. Réponses: 3
    Dernier message: 07/08/2013, 12h44
  3. Calculer une racine carrée
    Par eldiablo7 dans le forum C
    Réponses: 1
    Dernier message: 21/04/2009, 21h43
  4. Comment calculer une racine carrée ?
    Par Poseidon62 dans le forum Ada
    Réponses: 9
    Dernier message: 28/11/2006, 00h29

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