Aide pour calcul float
Résolu/Fermé
mrquebec13
Messages postés
8
Date d'inscription
jeudi 4 décembre 2014
Statut
Membre
Dernière intervention
14 décembre 2014
-
Modifié par mrquebec13 le 4/12/2014 à 20:06
mrquebec13 Messages postés 8 Date d'inscription jeudi 4 décembre 2014 Statut Membre Dernière intervention 14 décembre 2014 - 14 déc. 2014 à 18:12
mrquebec13 Messages postés 8 Date d'inscription jeudi 4 décembre 2014 Statut Membre Dernière intervention 14 décembre 2014 - 14 déc. 2014 à 18:12
A voir également:
- L'expression doit être de type intégral ou enum non délimité
- Calcul moyenne excel - Guide
- Calcul charpente bois gratuit - Télécharger - Architecture & Déco
- Logiciel gratuit calcul valeur nutritionnelle - Télécharger - Santé & Bien-être
- Logiciel calcul surface terrain gratuit - Télécharger - Outils professionnels
- Calcul km marche à pied gratuit - Télécharger - Sport
5 réponses
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
5 déc. 2014 à 18:34
5 déc. 2014 à 18:34
Bonsoir
avant d'allé plus loin dans le code , c'est quoi ça
avant d'allé plus loin dans le code , c'est quoi ça
float [/contents/91-radius radius]; float surface; cin >> radius;
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
10 déc. 2014 à 20:53
10 déc. 2014 à 20:53
Bonsoir
La ligne
Mais, il faut comprendre également et je pense que c'est important, qu'une variable déclarée constante n'est pas vraiment constante.
On peut tout à fait remplacer la valeur d'une constante en passant par un alias ( une variable pointeur) voici un exemple concret:
Bref, pour viser la constante complète il est préférable de la définir comme ceci
Et enfin mise à part d'autres soucis de variable et fonction il y a également des soucis d'algorithmes tout est à revoir et diable pourquoi ?
Pour la ligne
et des fonctions comme:
Bref, c'est tout le programme qu'il faut revoir et si tu n'es pas trop en accord avec le langage C ou langage C++ je te conseille le langage python qui est beaucoup plus simple.
à bientôt
La ligne
float const pi = 3.14159;est correct et cela veut dire que la valeur de la variable doit reste inchangé donc constant de plus en a la possibilité de l'écrire de plusieurs manières exemple:
const float pi = 3.14; float const pi = 3.14; const float const pi = 3.14;
Mais, il faut comprendre également et je pense que c'est important, qu'une variable déclarée constante n'est pas vraiment constante.
On peut tout à fait remplacer la valeur d'une constante en passant par un alias ( une variable pointeur) voici un exemple concret:
#include <cmath> #include <iostream> #define PI 3.14159 int main( void ){ /*** * Définition de constante ***/ const float pi = 3.14; //float const pi = 3.14; //const float const pi = 3.14; std::cout << "Valeur pi origine = " << pi << std::endl; //Manip pointeur alias float *px = &(float)pi; *px = 100; //Affiche résultat std::cout << "Nouvelle valeur pi = " << pi << std::endl; std::cout << "Valeur px = " << *px << std::endl; /*** * pi reste une constante et ne peut être * modifier. à la compilation il aura une * erreur donc pas de compilation * METTRE EN COMMENTAIRE POUR FAIRE LA SUITE DES TESTE ***/ //pi = 3.14; //Erreur a la compilation //std::cout << "Valeur pi = " << pi << std::endl; //std::cout << "Valeur px = " << *px << std::endl; /*** * pi à été modifier par alias * grace à px qui pointe à l'adresse * de pi le compilateur accepte et modifie * la valeur qui ce trouve à l'adresse de pi ***/ *px = PI; std::cout << "Valeur pi = " << pi << std::endl; std::cout << "Valeur px = " << *px << std::endl; //Conclusion std::cout << "#define inchanger et préférable (PI) = " << PI << std::endl; std::cout << "Variable constante & potentiellement modifiable (pi) = " << pi << std::endl; std::cout << "Variable pointeur (px) permettant la modification de (pi) = " << *px << std::endl; return ( 0 ); }
Bref, pour viser la constante complète il est préférable de la définir comme ceci
#define PI 3.14159
Et enfin mise à part d'autres soucis de variable et fonction il y a également des soucis d'algorithmes tout est à revoir et diable pourquoi ?
do { exit(0); } while (form = 2);et ça sert à quoi ?
Pour la ligne
surface = pi * radius ^ 2;moi je comprends l'utilisation des puissances enfin si c'est ce que tu compte faire et pour faire ça, sois on écris la fonction sois-même ou on utilises les fonctions mathématiques en langage C/C++ en utilisant :
#include <cmath>
et des fonctions comme:
float powf (float base, float power); float sqrtf (float x);etc..
Bref, c'est tout le programme qu'il faut revoir et si tu n'es pas trop en accord avec le langage C ou langage C++ je te conseille le langage python qui est beaucoup plus simple.
à bientôt
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
10 déc. 2014 à 22:23
10 déc. 2014 à 22:23
Bonjour,
Plusieurs remarques :
1/ Il vaut mieux utiliser des doubles sauf cas particulier (ce dont je doute ici ;-)).
2/ surface = pi * radius ^ 2;
^ n'est pas l'opérateur de puissance en C++. D'ailleurs, l'opérateur de puissance n'existe pas en C++. Pour réaliser des puissances de flottants, il y a une bibliothèque standard. Mais pour un simple carré, il te suffit de mettre : surface=pi*radius*radius;
3/ system ("pause");
Tu n'as pas inclus le header cstdlib. Attention ce comportement n'est pas standard et dépend de l'OS...
4/ while (form = 0);
Attention l'opérateur de comparaison est le double égal. De plus, on ne fait pas la comparaison entre deux flottants. On calcule plutôt la valeur absolue de la différence entre les deux et on vérifie que cela est très petit.
Ici :
Note : il faut inclure cmath
Je te conseille de faire une fonction compare(double n1,double n2, int precision) qui renverrait true si les flottants sont très proches.
5/ Attention à tes while. Beaucoup sont inutiles... Si aucune variable ne change dans la boucle, soit elle ne sera jamais exécutée soit cela partira en boucle infinie (sauf si bug ou appel explicite de fin).
Cdlt,
Plusieurs remarques :
1/ Il vaut mieux utiliser des doubles sauf cas particulier (ce dont je doute ici ;-)).
2/ surface = pi * radius ^ 2;
^ n'est pas l'opérateur de puissance en C++. D'ailleurs, l'opérateur de puissance n'existe pas en C++. Pour réaliser des puissances de flottants, il y a une bibliothèque standard. Mais pour un simple carré, il te suffit de mettre : surface=pi*radius*radius;
3/ system ("pause");
Tu n'as pas inclus le header cstdlib. Attention ce comportement n'est pas standard et dépend de l'OS...
4/ while (form = 0);
Attention l'opérateur de comparaison est le double égal. De plus, on ne fait pas la comparaison entre deux flottants. On calcule plutôt la valeur absolue de la différence entre les deux et on vérifie que cela est très petit.
Ici :
std::abs(form) < std::numeric_limits<T>::epsilon() * std::abs(form) * 2 || std::abs(x-y) < std::numeric_limits<T>::min();
Note : il faut inclure cmath
Je te conseille de faire une fonction compare(double n1,double n2, int precision) qui renverrait true si les flottants sont très proches.
5/ Attention à tes while. Beaucoup sont inutiles... Si aucune variable ne change dans la boucle, soit elle ne sera jamais exécutée soit cela partira en boucle infinie (sauf si bug ou appel explicite de fin).
Cdlt,
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
10 déc. 2014 à 22:43
10 déc. 2014 à 22:43
Je confirme la conclusion de @fiddy
:)
:)
mrquebec13
Messages postés
8
Date d'inscription
jeudi 4 décembre 2014
Statut
Membre
Dernière intervention
14 décembre 2014
14 déc. 2014 à 05:39
14 déc. 2014 à 05:39
Merci a tous!
J'ai corrigé mes erreurs et maintenant mon programme fonctionne à merveille, mais pour ce qui est de ma deuxième question je n'ai toujours pas trouver de réponse:
"J'aimerais aussi savoir si il y a un moyen pour qu'à la fin du programme il retourne au début"
Autrement dit, j'aimerais savoir si il y a un moyen de refaire le code en entier ou seulement une partie du code en boucle comme pour la commande "goto" en langage DOS(batch).
Merci!
J'ai corrigé mes erreurs et maintenant mon programme fonctionne à merveille, mais pour ce qui est de ma deuxième question je n'ai toujours pas trouver de réponse:
"J'aimerais aussi savoir si il y a un moyen pour qu'à la fin du programme il retourne au début"
Autrement dit, j'aimerais savoir si il y a un moyen de refaire le code en entier ou seulement une partie du code en boucle comme pour la commande "goto" en langage DOS(batch).
Merci!
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
14 déc. 2014 à 15:26
14 déc. 2014 à 15:26
Il suffit de mettre une boucle while.
Au pire, tu peux créer des fonctions et l'appeler quand bon il te semble.
Au pire, tu peux créer des fonctions et l'appeler quand bon il te semble.
mrquebec13
Messages postés
8
Date d'inscription
jeudi 4 décembre 2014
Statut
Membre
Dernière intervention
14 décembre 2014
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
14 déc. 2014 à 18:12
14 déc. 2014 à 18:12
je n'y avais pas penser merci!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
ligne 6:
const float pi = 3.14159; // mettre const avant le type de variable
ligne 17:
while (form == 0); // operateur de comparaison == et non d'affectation =
ligne 27:
while (form == 1); // operateur de comparaison == et non d'affectation =
ligne 30
while (form == 2); // operateur de comparaison == et non d'affectation =
Les déclarations float b,h,square, ...etc... devraient être placées à l'extérieur des boucles do ... while ( avant les boucles).
ligne 6:
const float pi = 3.14159; // mettre const avant le type de variable
ligne 17:
while (form == 0); // operateur de comparaison == et non d'affectation =
ligne 27:
while (form == 1); // operateur de comparaison == et non d'affectation =
ligne 30
while (form == 2); // operateur de comparaison == et non d'affectation =
Les déclarations float b,h,square, ...etc... devraient être placées à l'extérieur des boucles do ... while ( avant les boucles).
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
10 déc. 2014 à 22:07
10 déc. 2014 à 22:07
ligne 6:
const float pi = 3.14159; // mettre const avant le type de variable
Non, pas nécessairement.
ligne 17:
while (form == 0); // operateur de comparaison == et non d'affectation =
Yes, mais on évite la comparaison avec 0 lorsque l'on a affaire à des flottants.
Les déclarations float b,h,square, ...etc... devraient être placées à l'extérieur des boucles do ... while ( avant les boucles).
Non au contraire. Ils sont très bien placés. Pour une fois que la portée des variables est respectée...
const float pi = 3.14159; // mettre const avant le type de variable
Non, pas nécessairement.
ligne 17:
while (form == 0); // operateur de comparaison == et non d'affectation =
Yes, mais on évite la comparaison avec 0 lorsque l'on a affaire à des flottants.
Les déclarations float b,h,square, ...etc... devraient être placées à l'extérieur des boucles do ... while ( avant les boucles).
Non au contraire. Ils sont très bien placés. Pour une fois que la portée des variables est respectée...
Modifié par mrquebec13 le 8/12/2014 à 16:59