[C++] Faire une racine carrée et un arrondi!! C'est pas compliqué!!!

Faire une racine carrée et un arrondi!! C'est pas compliqué!!! [C++] - Programmation

Marsh Posté le 01-04-2001 à 12:32:53    

j'ai x^2  
je veux y= arrondi de x

Reply

Marsh Posté le 01-04-2001 à 12:32:53   

Reply

Marsh Posté le 01-04-2001 à 13:08:58    

Cytoplasm a écrit a écrit :

j'ai x^2  
je veux y= arrondi de x




int y(int x2){
int res=65536,old;
do{old=res;res=(old+x2/old)/2);}while(res!=old);
return res;
}
On calcule ici la racine carrée de x2, arrondi à l'entier inférieur. La valeur de départ de res peut être quelconque, mais ici 65536 est une optimisation en moyenne du nombre de boucles qui est réduit à 16 boucles au pire si int est sur 32 bits. En partant de 1 on aurait jusqu'à 31 boucles, et en partant de 0 on en aurait jusqu'à 32 au pire.

 

[edit]--Message édité par verdy_p--[/edit]

Reply

Marsh Posté le 01-04-2001 à 15:04:32    

#include <math.h>
 
y=(int)(sqrt(x));

Reply

Marsh Posté le 01-04-2001 à 17:42:01    

Pour obtenir l'entier le plus proche ajoute 0.5 avant de convertir :
 
y=(int)(sqrt(x)+0.5f);

Reply

Marsh Posté le 01-04-2001 à 19:52:01    

Evidemment avec sqrt() c'est plus simple, mais plus long sur la plupart des machines dans le cas des entiers, sauf si le compilateur sait convertir sqrt() comme un intrinsèque en code FPU, et si le processeur a une FPU rapide sachant exécuter une racine carrée, une addition, et une conversion entière en 1 cycle machine. Sinon, c'est prendre une usine à gaz pour écraser une mouche.

Reply

Marsh Posté le 01-04-2001 à 23:05:21    

lol .. si tu veux faire pleurer ton CPU fait lui calculer PI ..
 
la solution la plus simple est tjrs la meilleure - faut pas l'oublier !
 
et la solution la plus simple c'est la plus courte - et donc la moins buggée.
 
ex : pour afficher l'heure sur son pc :
- on utilise les bibliotheque de base
- on joue avec l'interruption de l'horloge
- on appelle l'horlogue parlante toutes les secondes ;-)
 
j'ai deja testé toutes les solutions .. bah moi je crois que ca sert a rien de reinventer le monde tous les 4 matins .. surtout pour un truc aussi eprouvé que la racine carrée.

Reply

Marsh Posté le 02-04-2001 à 09:04:50    

verdy_p a écrit a écrit :

Evidemment avec sqrt() c'est plus simple, mais plus long sur la plupart des machines dans le cas des entiers, sauf si le compilateur sait convertir sqrt() comme un intrinsèque en code FPU, et si le processeur a une FPU rapide sachant exécuter une racine carrée, une addition, et une conversion entière en 1 cycle machine. Sinon, c'est prendre une usine à gaz pour écraser une mouche.




Honnetement tu crois que ton code s'execute en un cycle machine ?
Tu devrait le coder en asm et les division par deux pourquoi ne pas utiliser des decalages de bits ?
 
Restons serieux sqrt est beaucoup plus lisible...

Reply

Marsh Posté le 03-04-2001 à 01:26:15    

BENB> Tu vas dans le sens de Verdy. Le code qu'il a donné est toujours plus efficace dès lors qu'on travaille sur des entiers.
 
Croyez-moi, il y a des fois où le code que Verdy a donné est bien plus approprié (bien qu'il soit ici bien peu lisible, je vous l'accorde, mais vous pouvez le présenter un peu mieux à titre d'exercice). Tout dépend de ce que vous voulez faire / pas faire, du nombre de fois où vous exécutez votre code, etc.
 
Et à condition d'écrire "res=x2" (voire "res=x2 >> 1", n'est-ce pas BENB ;-) ) au lieu du beaucoup plus dangereux "res=65536", ce code est sans erreurs. Une fois caché dans une fonction appropriée, il n'aurau pas à changer, et il n'aura pas à être débogué => aussi sûr que le sqrt() sur des flottants (voire plus, puisque pas de problème d'arrondi).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed