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 :

9, une valeur mortelle !


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Agronome
    Inscrit en
    Septembre 2018
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Agronome
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2018
    Messages : 97
    Points : 60
    Points
    60
    Par défaut 9, une valeur mortelle !
    Bonjour, voilà le message qui s'affiche quand l'utilisateur donne 9 !! Toutes les autres valeurs sont acceptées !

    Le debugger affiche : "Program has been killed (because output is larger than 20 MB)" quand l'utilsateur donne 9.

    ---> programme qui calcul une approximation de la racine carre par la methode des suites adjacentes.
    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
     
    #include <stdio.h> 
    #include <stdlib.h>
     
    int main(void) { 
     
    	int n=0;
    	float u=1, v, un, vn, diff;
     
    	printf("calcul des racines carrees par les approximation suivant la methode des suites adjacentes\n"); 
     
    	printf("entrez un nombre reel a dont on va calculer sa racine carre : ");
    	scanf("%f", &v); 	
     
    	do{ 	
    			un=2/((1/u)+(1/v));
    			vn=(v+u)/2;
    		diff = vn - un;
    		printf("\nDiff entre un et vn : %.4f\n",diff);
    		printf("\t[moyenne harmonique (un) %.4f]\n",un);
    		printf("\t[moyenne arithmetique (vn) %.4f]\n",vn);
    			n++;
    			u=un;
    			v=vn;
    	}while(diff!=0);
    	printf("\nIl faut iterer %d fois les moyennes pour que la difference entre la moyenne harmonique (un) \net la moyenne arithmetique (vn) soit suffisament petite (ici, elle vaut 0). \n\n=> Racine carre de a vaut %.4f\n\n", n,u); 	  
    	return 0; 
    }

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Chez-moi, ton programme fonctionne sans souci même avec 9. Toutefois il ne sort jamais de la boucle parce que "diff" ne vaut jamais 0 avec exactitude.
    On ne compare jamais un float avec une valeur parce que le float a une imprécision parfois impossible à annuler. Pour vérifier la correspondance avec une valeur, vaut mieux alors regarder si la différence avec ladite valeur est plus petite qu'un epsilon défini à l'avance.

    Toutefois ici il y a une autre façon de faire bien meilleure: regarder si le diff de l'itération X+1 est différent de celui de l'itération X (il te faut juste un second diff pour récupérer la valeur du premier avant que le premier ne change). Parce que quand les deux sont égaux, cela signifie que tu es arrivé en limite de précision de calcul du processeur et que calculer devient inutile (c'est mon prof de C qui m'avait appris ça).

    Donc ta boucle devient
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    do {
    	un=2/((1/u)+(1/v));
    	vn=(v+u)/2;
    	diff2=diff;
    	diff = vn - un;
    	printf("\nDiff entre un et vn : %.4f\n",diff);
    	printf("\t[moyenne harmonique (un) %.4f]\n",un);
    	printf("\t[moyenne arithmetique (vn) %.4f]\n",vn);
    	n++;
    	u=un;
    	v=vn;
    } while (diff != diff2);

    Par ailleurs il y a une autre méthode plus simple pour calculer la racine carrée de N: définir U0=X quelconque différent de 0 puis calculer Un+1 = ½ (Un + N/Un) (N étant le nombre dont tu veux la racine). Cette suite tend vers racine(N). Ainsi pas besoin de un et vn. Juste u, v et diff suffisent (et n pour ton compteur évidemment)
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    u=v;		// On part du principe évident que v, nombre dont on veut la racine, ne vaut pas 0. On peut écrire aussi u=1 ou u=187 ça ne change rien
    do {
    	diff=u;
    	u=0.5 * (u + v/u);
    	printf("\t[suite (u) %.4f]\n",u);
    	n++;
    } while (u != diff);
    Et là encore ça fonctionne même avec 9.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre du Club
    Homme Profil pro
    Agronome
    Inscrit en
    Septembre 2018
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Agronome
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2018
    Messages : 97
    Points : 60
    Points
    60
    Par défaut
    Un tres grand merci, je vais mettre ces parties de codes dans mon portfolio. J'ai augmenter mon nombre de decimals et je constate que ma moyenne harmoniques va solliciter d'1vantage la precision de calculs du processeur de ma pauvre petite tablette qui va ensuite effectuer moult calculs inutiles.

    Avec ma premiere version de code, mon compilateur compile a l'inf. J'ai prit la deuxieme version et en effet, la boucle s'arrete avec la diff egale a la precedente.

    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
    calcul des racines carrees par les approximation suivant la methode des suites adjacentes
    entrez un nombre reel a dont on va calculer sa racine carre : 9
     
    Diff entre un et vn : 3.200000048
    	[moyenne harmonique (un) 1.799999952]
    	[moyenne arithmetique (vn) 5.000000000]
     
    Diff entre un et vn : 0.752941370
    	[moyenne harmonique (un) 2.647058725]
    	[moyenne arithmetique (vn) 3.400000095]
     
    Diff entre un et vn : 0.046875715
    	[moyenne harmonique (un) 2.976653814]
    	[moyenne arithmetique (vn) 3.023529530]
     
    Diff entre un et vn : 0.000183105
    	[moyenne harmonique (un) 2.999908447]
    	[moyenne arithmetique (vn) 3.000091553]
     
    Diff entre un et vn : -0.000000238
    	[moyenne harmonique (un) 3.000000238]
    	[moyenne arithmetique (vn) 3.000000000]
     
    Diff entre un et vn : -0.000000238
    	[moyenne harmonique (un) 3.000000238]
    	[moyenne arithmetique (vn) 3.000000000]
     
    Il faut iterer 6 fois les moyennes pour que la difference entre la moyenne harmonique (un) 
    et la moyenne arithmetique (vn) soit suffisament petite (ici, elle vaut o). 
     
    => Racine carre de a vaut 3.0000
    Un grabd merci pour votre temps.

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

Discussions similaires

  1. programme qui calcule la racine carré
    Par l1informatique dans le forum Calcul scientifique
    Réponses: 6
    Dernier message: 01/03/2014, 16h35
  2. Programme de calcul de racine carrée entière par défaut.
    Par Temari8 dans le forum Général Python
    Réponses: 2
    Dernier message: 07/12/2013, 19h14
  3. Programme racine carrée
    Par yo_haha dans le forum Débuter
    Réponses: 9
    Dernier message: 19/01/2009, 20h00
  4. [Astuce] Approximation de racines carrées
    Par Smortex dans le forum Assembleur
    Réponses: 16
    Dernier message: 18/05/2004, 06h17
  5. Racine carrée
    Par SteelBox dans le forum Mathématiques
    Réponses: 5
    Dernier message: 23/11/2002, 17h15

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