begin process at 2012 05 28 09:21:02
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Maths & Algorithmes

 > 

arrondi


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

arrondi

mercredi 27 octobre 2004 à 21:24:42 | arrondi

Arnaud16022

Membre Club
good-day everybody

ya quelques temps je m suis amusé (si on peut dire) a refaire la fonction round() de la TI 83 en TIBasic.
Ca marchait super bien, et comme je n'ai rien trouvé de tel en C++ (a part floor, qui fait une troncature, et ceil (je crois)), j'ai voulu implémenter ca.

ca donne:


double round(double nombre,int arrondi){
double puissance=(double)pow(10,arrondi);
return floor(puissance*nombre+0.5)/puissance;
}
int main()
{
double nbre=1.123456546;

cout << "valeur arrondie de " << nbre << " a 4 chiffres apres la virgule: " << round(nbre,4) << "\n\n";
system("PAUSE");
return 0;
}

Comme vous le voyez, cette fonction fait un arrondi (pas une troncature! un vrai arrondi a n chiffres apres la virgules), et en TIBasic ca donnait axactement la meme chose que la fonction rand().

Celle ci aussi parche bien, mais commence a planter a partir de 1000, là il aime pas du tout et retourne une valeur arrondie différemment.

Voili voilou, si vous savez pourquoi vous etes le bienvenu :)

Merci

PS: double, long ou float, ca ne change rien du tt :(
mercredi 27 octobre 2004 à 21:50:08 | Re : arrondi

Gendal67


Euh, tu veux une fonction qui ecrit un nombre selon une précision ? genre le nombre "pi" : 3.1416 ou pi = 3.141, etc ?
Ben si tu veux qqch qui gère la présicion, tu as un manipulateur en C++ qui le fait :

cout << setprecision(4) << pi << "\t" << setprecision(3) << pi;

ou en C:

float pi = 3.1416

printf("pi avec 2 chiffres significatifs s'écrit : %.3", pi); // affichage à 0.001 près :)

Genda67, à votre service !
mercredi 27 octobre 2004 à 22:16:43 | Re : arrondi

Arnaud16022

Membre Club
nan c'est pas ca.
ces 2 fonctions je les connais, elles ne font que modifier la précision d'AFFICHAGE.
Ma fonction fait un vrai arrondi, comme en maths ou en physique.
Ne me demande pas a quoi ca sert, c'est juste pour le fun :)
mercredi 27 octobre 2004 à 22:42:53 | Re : arrondi

jpthomasset

Une petite remarque sur la précision des types : le type double ne gere pas un nombre infini de nombre après la virgule (de mémoire la précision est de 15 digit mais je suis pas sur), ce qui parfois amener de curieux résultats.

Je penche perso pour la solution de Genda67, en c++ du moins : en effet ios_base::precision permet de gerer des arrondis mathématique et ne tronque donc pas le nombre (je n'en suis pas sur pour le printf par contre). Pour info Genda, l'arrondi de 3.1416 à 3 chiffres apres la virgule est 3.142 et pas 3.141.

Par contre si tu as besoin d'une grande précision dans les calculs, alors il faut te pencher sur des librairies spécialisés qui permettent de gerer des nombre plus précisement que les types prédefinis. Par exemple GNU MP

A+,
JP.

PS: ta fonction ne marche pas avec les nombre négatifs, il faut retrancher 0.5 dans ce cas !
mercredi 27 octobre 2004 à 23:10:36 | Re : arrondi

gagah1

Membre Club
Avec ceci ça devrait marcher:
double Round(double valeur, int arrondi)
{
double a, b, c;

a = pow(10.0, (double)arrondi);
b = (double)(int)(valeur*a);

c = fabs(valeur*a - b);
if((c>0.5)&&(valeur>0))
return (b+1.0)/a;
else if((c>0.5)&&(valeur<0))
return (b-1.0)/a;

return b/a;
}
mercredi 27 octobre 2004 à 23:22:34 | Re : arrondi

Arnaud16022

Membre Club
(double)(int)?
je vois bien comment ton code marche mais ca je comprend pas.

Sinon effectivement ca devrait marcher, masi moi j'aimerai savoir pourquoi mon prog a moi ne marche pas (c'est qd meme plus simple, il n'y a qu'une ligne!)
mercredi 27 octobre 2004 à 23:32:56 | Re : arrondi

djl

(int) pour garder que la partie entiere
jeudi 28 octobre 2004 à 00:02:21 | Re : arrondi

jpthomasset

Le code de gagah fait la meme chose que le tien, à part pour les nombre négatifs. Par contre si ton problème est un problème de précision, alors cela ne va pas regler ton problème.
Encore une fois, le double n'est pas d'une précision infinie.

Pour info son code peux aussi se résumer en une ligne :


double round(double nombre,int arrondi){
double puissance=(double)pow(10,arrondi);

return (nombre>0)?((int)(puissance*nombre+0.5))/puissance:((int)(puissance*nombre-0.5))/puissance;

}


et plus clairement :

double round(double nombre,int arrondi){
double puissance=(double)pow(10,arrondi);

if (nombre>0) {
return floor(puissance*nombre+0.5)/puissance;
}else {
return floor(puissance*nombre-0.5)/puissance;

}


ce qui revient au code de gagah !

A+,
JP.
jeudi 28 octobre 2004 à 11:11:46 | Re : arrondi

Arnaud16022

Membre Club
oui je sais, ya 12 ou 15 chiffres dans un double (je sé plus).
mais a partir de 1000, mon prog, qui marche jusque la, ne met plus que 2 chiffres apres la virgule, ce qui fait 4+3=7chiffres, et pas 12!

A priori, meme un float devrait pouvoir le faire.
jeudi 28 octobre 2004 à 12:00:00 | Re : arrondi

jpthomasset

Réponse acceptée !
Cela vient de la précision d'affichage dont parlait Genda67, pour le contourner, fait un
cout.precision(10);

avant le cout<<

A+,
JP.

1 2

Cette discussion est classée dans : fonction, arrondi, double, puissance, round


Répondre à ce message

Sujets en rapport avec ce message

round et mfc [ par dambeaufort ] bonjour,voici mon probleme: je suis sous une application mfc et j'ai une boite Cedit qui me permet d'entrer une valeur numerique (un double pour moi). Definition de fonction pendant l'execution [ par progueur ] Bonsoir,Je suis en train de faire un programme de calcul sur des fonctions mathematiques.Et j'aimerais que l'utilisateur puisse entrer sa fonction de Fonction racine carre puissance et factoriel [ par Samuel0210 ] Bonjour Voila, g creer 3 fonctions pour calculer la racine carre, la puissance et le factoriel de different nombres elles se compile sans erreur mé e conversion double en string [ par bouba ] Bonjour, je réalise une fonction qui doit calculer le nombre de caractères d'un doubleexemple:-7.56 -> 5 caractèreExiste t'il une fonction qui fasse c c++ : pb avec une fonction extern C [ par nanch07 ] J'expose tout, voilà: dans une de mes classes je fais appel à une fonction externe en C ( de numerical recipes in C). Mais j'ai également besoin de ce Utilisation d'un pointeur de fonction membre [ par cyrcocq ] Bonjour,J'ai déjà discuté de ça ailleurs, on m'a conseillé d'autres méthodes, mais imaginons une classe contenant un ensemble de fonction accessibles Pb avec Round...? [ par Topsyko ] Bonjour,J'ai créé une classe pour calculer l'histogramme d'une image, et dans une fonction j'utilise la fonction de math.h Round, et j'ai cette erreur Graphique f(x)=x^p [ par dustez ] On me demande de réaliser un programme affichant sous forme textuelle des graphiques représentant les fonction du type f(x)=x^p, à partir des paramètr programeation d'une type de puissance [ par awalle ] bon soir à tout le monde j'ai un problème de la fonction puissance en langage C. Mon problème est le faite que, je veux programmer en langage C aidez moi svp [ par youssielec ] je cherche a creer un programme qui genere entre 1 et 10 numeros de cartes de credit valides. j dois d abord saisir et valider le nombre de cartes d


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,983 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales