Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
750 connectés 

 


Dernière réponse
Sujet : [C++] Faire une racine carrée et un arrondi!! C'est pas compliqué!!!
BifaceMcLeOD 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).

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
BifaceMcLeOD 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).
BENB

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...

la viper 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.
verdy_p 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.
z51 Pour obtenir l'entier le plus proche ajoute 0.5 avant de convertir :
 
y=(int)(sqrt(x)+0.5f);
wave #include <math.h>
 
y=(int)(sqrt(x));
verdy_p

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]

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

Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR