Connexion
Menu Principal
Recherche
Menu secondaire
Image Aléatoire
engin_stelaire_10001.jpg
Publicité
Formation Blender ElephormBlender 3d Elephorm


     






Probleme sur un programme en C
OverdOzed
Inscrit:
01/01/2012 00:13
Post(s): 305
Salut à tous blenderien, je sais que ce sujet n'a pas trop sa place sur un forum en rapport avec la 3d mais les autres forums sur lesquels j'ai posté et également des gens à qui j'ai demandé ne savent pas me répondre, et comme j'ai vu que sur le clan il y a des codeurs je me suis dit pourquoi pas !
Si personne ne sait me répondre pourriez vous me renvoyer vers des forums plus expert.
Bon alors voilà le problème pou m’entraîner au langage C j'ai décidé il n'y a pas longtemps de coder un programme de calcul de racine carré par dichotomie, vous allez me dire " hé mais ça sert à rien tu peux faire sqrt bla bla " Le truc c'est que c'est pour m’entraîner pas pour calculer des racines carrées, Le programme fonctionne a deux détail près:
1. La racine carré de 36 est 5.997799 donc il tombe presque juste mais pas totalement
2. Quand on demande une précision trop élevé le programme s'arrète
Voila le code

Citation :

#include <stdio.h>
#include <stdlib.h>

int main()
{
int n = 0;
float a = 0, b = 0, r = 0, eps = 0, delta = 0, m = 0;
printf("Entrez le nombre dont vous voulez la racine carré:\n");
scanf("%d", &n);
printf("Entrez la première borne:\n");
scanf("%f", &a);
printf("Entrez la deuxiéme borne:\n");
scanf("%f", &b);
printf("Entrez le degré de précision sous la forme 0.000 ... 1:\n");
scanf("%f", &eps);
while (b - a > eps)
{
delta = b - a;
m = delta / 2;
r = a + m;
if (r * r > n)
{
b = b - m;
}
else
{
a = a + m;
}
}
printf("La racine carré de %d est %f\n", n, r);
printf("Info complémentaire: La valeur de la première borne est maintenant %f, celle de la deuxième borne est de %f, celle de delta de %f, celle de m %f et pour epsilon %f\n", a, b, delta, m, eps);

return 0;
}

je n'ai pas pris la peine de le commenter car je le trouve relativement simple, cependant si vous voulez des commentaires dites-le.
Merci d'avance.

edit;
: je ne suis pas sur d'avoir accès à Internet les jours qui vont suivre donc ne vous étonné pas si je ne répond pas .

Contribution le : 08/08/2012 16:59
_________________
"Le jour où Microsoft inventera un truc qui ne plante pas ce sera un clou"


Mon site Internet: Soyez Indulgent je débute en HTML/CSS.
Créer un fichier PDF de la contribution Imprimer


Re: Probleme sur un programme en C ( Calcul de racine carré )
OverdOzed
Inscrit:
29/04/2007 20:11
De Nîmes...300 jours de soleil par an, inondations le reste du temps
Post(s): 3183
Pour 1/, c'est normal : tu as un résultat approché qui converge vers le résultat réel. Donc, si tu n'itères pas assez, tu arrêtes le calcul avant d'avoir atteint une précision acceptable. Le calcul par dichotomie ne tombe jamais juste, sauf si par hasard tu as choisi des bornes qui tombent bien (avec 4 et 12, ça tomberait pile, par exemple).

Pour 2/, que veut dire "une précision trop élevée" ? Combien ? Et "le programme s'arrête" => comment ? Un message d'erreur quelconque ? Je ne vois pas ce qui peut faire planter un truc aussi simple...

Par ailleurs, le code peut se simplifier un chouilla en se passant de delta et m, qui n'apportent rien (ces variables ne servent que comme résultats intermédiaires, écrits et lus une seule fois) :
while (b - a > eps)
{
   r = (a + b)/2;
   if (r * r > n)
   {
      b = r;
   }
   else
   {
      a = r;
   }
}

Contribution le : 08/08/2012 17:52
_________________
|C'est en forgeant qu'on devient forgeron, c'est en mouchant qu'on devient moucheron et c'est en sciant que Léonard devint scie.
Créer un fichier PDF de la contribution Imprimer


Re: Probleme sur un programme en C ( Calcul de racine carré )
Touriste
Inscrit:
08/08/2012 18:26
Post(s): 1
Bonjour Aspirine62400.
Je plussoie DaWaaaaghBabal le calcul de dichotomique ne peut pas tomber juste. Tu ne peux pas vraiment régler ton problème 1/ la seule chose que tu peux faire c'est vérifier si, par un coup de bol extraordinaire tu ne tomerait pas pile sur le bon nombre en rajoutant dans ton while quelque chose comme
Citation :

else if (r*r==n)
{
a=r;
b=r;
m=0;
delta=0;
break;
}

mais ça ne règle pas beaucoup de cas...

Pour 2/ après quelque tests je pense avoir compris le problème.Mon hypothèse est qu'il provient de la précision du format float en C. Quand tu demandes une trop grande précision ta variable eps vaut en fait 0 et ta boucle while devient infinie donc le programme s'arrête.

Solutions :
Tu peux partiellement régler ce problème en définissant tes variables en tant que long double ,qui est un type plus précis que float. Cependant, si tu demande une précision encore plus grande, tu auras le même problème.

En bref tu peux atténuer le problème mais pas le résoudre complètement à moins, peut être, d'utiliser une bibliothèque spécialisée dans le calcul en précision arbitraire de ce style (à vérifier je n'ai pas testé). Mais ça parait excessif vu la simplicité de ton programme.

Enfin si tu veux t'amuser tu peux essayer de coder la même chose avec d'autre algorithmes.Il me semble que la Méthode de Newton est bien plus rapide que la méthode dichotomique pour ce genre de calculs.

Voilà j'espère t'avoir un peu aidé (et ne pas avoir dis trop de bêtises)

Contribution le : 08/08/2012 19:30
Créer un fichier PDF de la contribution Imprimer


Re: Probleme sur un programme en C ( Calcul de racine carré )
OverdOzed
Inscrit:
01/01/2012 00:13
Post(s): 305
Tout d'abord je vous remercie tous les deux pour vos réponses qui me sont très utiles, @ DaWaaaaghBabal et Vaydre, c'est bien ce que je craignais en effet, impossible de tomber juste avec le calcul par dichotomie, merci de me le confirmer, @ DaWaaaaghBabal, c'est vrai que j'aurai pu simplifier le code de cette façon, merci de me le faire remarquer, @ Vaydre, oui apparemment c'est ce qui se passe la boucle devient infinie, d'ailleurs sa en a tous les symptômes ! J'aurai du penser à utiliser un double mais comme tu le dis toi même ce n'est que repousser le problème, pour la bibliothèque ça devient un peu compliqué compte tenu de mon niveau mais c'est vrai que c'est intéressant, j'y reviendrai, quant à la méthode de Newton je ne la connaissait pas et merci de m'en avoir parlé, je vais m'y intéresser.
Encore merci à tous les deux quant a Vaydre je vois que c'est ton premier post donc bienvenue sur le
@+

Contribution le : 09/08/2012 15:58
_________________
"Le jour où Microsoft inventera un truc qui ne plante pas ce sera un clou"


Mon site Internet: Soyez Indulgent je débute en HTML/CSS.
Créer un fichier PDF de la contribution Imprimer


Re: Probleme sur un programme en C ( Calcul de racine carré )
OverdOzed
Inscrit:
23/02/2006 19:10
De 43°17′47″N 5°22′12″E
Post(s): 1702
Salut
C'est un problème d'algortihmique (numérique).

Comme dit, la dichotomie ne permet pas d'avoir un résultat précis dans certains cas mais c'est une méthode rapide. Pour les problèmes classiques il existe plusieurs méthodes et il faut choisir la meilleure selon ce qu'on recherche (performances vs résultat).
Ici, la méthode de Newton est efficace pour trouver une racine (carrée). Tu peux y jeter un oeil.

Il n'est pas utile d'utiliser les double parfois. La mémoire utilisée est doublée et il n'y a pas forcément de meilleurs résultats (l'expérience le montre). AMHA, GMP n'apporte rien dans ce cas, à part pour apprendre à s'en servir ce qui n'est pas inintéressant ! Si la méthode est foireuse, elle le reste. Ce n'est pas comme cela qu'il faut penser.

Ceci dit, pour le 2/ quand tu dis précision élevée, pense qu'un float, de par sa structure, ne peut aller au delà de 10-7 (il vaut mieux restreindre à 10-6 pour une meilleure précision). Donc si tu choisis quelque chose de plus petit il le considère comme étant 0 ou va savoir quoi...

Avant de lancer la boucle, fais donc un test sur la valeur rentrée par l'utilisateur... De toute façon, il faut toujours vérifier les données rentrées. C'est bien pour cela que l'interaction avec un utilisateur se fait uniquement à la fin du développement quand on est sûr que son moteur fonctionne sans bug.

Dans ce genre de programme, il faut généralement utiliser un garde fou (compteur et un nombre de tours max) qui permet de ne pas faire planter le programme en cas de forever. Tu conclues ton programme avec un test sur ce compteur : soit il est égal au nombre max et la racine n'est pas trouvée, sinon elle est approchée à la précision souhaitée.
Eventuellement l'utilisateur peut choisir le nombre d'iterations maximales (toujours en traitant cette donnée par la suite dans ton programme).

Contribution le : 10/08/2012 03:06
Créer un fichier PDF de la contribution Imprimer


Re: Probleme sur un programme en C ( Calcul de racine carré )
OverdOzed
Inscrit:
01/01/2012 00:13
Post(s): 305
Ce que tu dit Bibi09 est également intéressant, je ne connaissais pas le principe du garde-fou et c'est intéressant, je vais également mettre un test sur la valeur en entrée, bonne idée.
Encore Merci de votre aide.

Contribution le : 10/08/2012 12:40
_________________
"Le jour où Microsoft inventera un truc qui ne plante pas ce sera un clou"


Mon site Internet: Soyez Indulgent je débute en HTML/CSS.
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




Enregistrer votre réponse
Compte*
Nom   Mot de passe   Authentification
Message:*



[Recherche avancée]



Sujets récemment répondus
Forums Sujets Réponses Lus Dernières contributions
[WIP] et travaux terminés [WIP] Opel Zafira Z 1999    [1][2][3]...[6] 53 7885 Aujourd'hui 20:54:32
Benssawi 
Concours Défis Du Week-End 21 - Thème : Les Armes 1 50 Aujourd'hui 20:41:13
QU3NT155 
[WIP] et travaux terminés [WIP] Papa_Dragon apprend l'orga :)    [1][2][3]...[5] 49 2492 Aujourd'hui 20:39:35
dam 
Moteur de jeu GameBlender et alternatives [WIP] OSXIA : Plate-forme de distribution de jeux BGE [pré-bêta v0.35]    [1][2][3]...[11] 103 8314 Aujourd'hui 20:37:41
XAM 
Mes premières images sous Blender (débutants) Bencer: Apprentissage de l'animation    [1][2] 10 541 Aujourd'hui 20:37:38
Bencer 
The Blender Clan 'tchat Le topic des trucs à voir    [1][2][3]...[254] 2535 360771 Aujourd'hui 20:15:12
Papa_Dragon 
The Blender Clan 'tchat Tenté par un concours BGE ?    [1][2][3]...[5] 43 945 Aujourd'hui 20:14:09
ankhre 
Concours AC/BC no 8 : "OUPS!" !!! Deadline => 26/05 !!!    [1][2] 13 652 Aujourd'hui 20:12:10
ankhre 
The Blender Clan 'tchat Avez toujours du plaisir sur Blender ?    [1][2] 10 244 Aujourd'hui 19:55:34
Saphir 
The Blender Clan 'tchat [Sondage] Ferme de rendus Blender gratuite : trouvons lui un nom ! 4 85 Aujourd'hui 19:38:34
clouclou 
Le coin des geeks GTX780 et Cycles 4 125 Aujourd'hui 19:00:41
mistercroche 
Questions & Réponses rendu cycles gpu 0 40 Aujourd'hui 18:54:47
aledu29 
Moteur de jeu GameBlender et alternatives [WIP] Le 1er jour    [1][2][3]...[19] 183 13360 Aujourd'hui 18:51:40
meltingman 
Concours Défis Du Week-End 20 - Gagnant : BILL    [1][2][3]...[8] 77 2286 Aujourd'hui 18:49:51
Zhormos 
Questions & Réponses [résolu] Objet n'apparait pas au rendu.    [1][2] 10 135 Aujourd'hui 17:29:53
GreenGiant 
Questions & Réponses Rendu de scene1 dans un plan de scene2    [1][2] 10 328 Aujourd'hui 16:29:48
yekcim 
[WIP] et travaux terminés [terminé] Projets Divers (Mr Horizontal & Mme Verticale) page 15    [1][2][3]...[15] 146 17359 Aujourd'hui 14:40:01
adam 
Questions & Réponses [résolu] probleme de rendu avec incrustation de mesh dans video    [1][2] 14 95 Aujourd'hui 14:27:50
DoubleZ 
[WIP] et travaux terminés [WIP] Nouveau sculpt de mamuth    [1][2] 11 870 Aujourd'hui 14:27:32
otsoa 
[WIP] et travaux terminés [WIP] Lit    [1][2] 10 496 Aujourd'hui 14:10:02
Saphir 

Qui est en ligne
35 utilisateur(s) en ligne (dont 22 sur Forums)

Membre(s): 3
Invité(s): 32


simply_user, BILL, Lambda, plus...
Nouveaux membres
Zelkion 24/5/2013
Zen-A 24/5/2013
Lorindan 24/5/2013
filoudb 24/5/2013
GreenGiant 24/5/2013
respect62 24/5/2013
shabtai411 22/5/2013
Melanie56 22/5/2013
lelouis1er 22/5/2013
Styrinx 22/5/2013
Dernier Ajout
saak.jpg

Evènements à venir
Mai 24
Défis Du Week-End
Mai 31
Défis Du Week-End
plus 408 plus d'élément(s)
 By Mickaël Guédon [ebrain] © 2003-2013 The Blender Clan - hébergé par TuxFamily - Site déclaré à la CNIL sous le numéro 1155445