LES PUISSANCES DE 2 QUI ENTOURENT UN NOMBRE

Messages postés
370
Date d'inscription
lundi 1 avril 2002
Statut
Membre
Dernière intervention
11 février 2010
- - Dernière réponse : cs_Zeroc00l
Messages postés
370
Date d'inscription
lundi 1 avril 2002
Statut
Membre
Dernière intervention
11 février 2010
- 11 févr. 2005 à 02:32
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/18310-les-puissances-de-2-qui-entourent-un-nombre

Afficher la suite 
cs_Zeroc00l
Messages postés
370
Date d'inscription
lundi 1 avril 2002
Statut
Membre
Dernière intervention
11 février 2010
-
Y'a plus simple pour trouver deux puissance de deux qui entourent un nombre ... Non ? :----C

Soit xun entier quelconque et >=1
Alors :

Puissde2min := Trunc( ln(x-1) / ln(2) ) + 1;
Puissde2max := Trunc( ln(x) / ln(2) ) ;
If Puissde2min > Puissde2max then Dec(Puissde2min);

Ca, ça devrait marcher ... (code écrit directement ici, j'ai pas testé ) et c'est bien plus court ! ;-J
cs_Zeroc00l
Messages postés
370
Date d'inscription
lundi 1 avril 2002
Statut
Membre
Dernière intervention
11 février 2010
-
Bon en mangeant et en y repensant je me suis aperçu que je m'étais trompé et que j'avais oublié les valeurs négatives (de plus je me suis planté dans les formules. Je les ai inversé ... C'est ça de vouloir tout faire trop rapidement. Forcément, ça joue des tours ...) donc voila une fonction plus courte ET qui marche ! :) :

Procedure Puissde2minmax( x : real; var min, max : integer);
begin
If x = 1 then begin
min := 0;
max := 0;
end else
If x<1 then begin
min := -Trunc( ln(1/x-1) / ln(2) ) - 1;
max := -Trunc( ln(1/x ) / ln(2) );
end else begin
min := Trunc( ln(x) / ln(2) );
max := Trunc( ln(x-1) / ln(2) ) + 1;
end;
end;

voili voilo ! :)
cs_Zeroc00l
Messages postés
370
Date d'inscription
lundi 1 avril 2002
Statut
Membre
Dernière intervention
11 février 2010
-
* Plus courte et plus rapide que la tienne je pense.
* De plus on notera qu'on peut changer la base très simplement ... il suffit de changer les '2' ...
cs_peecota
Messages postés
3
Date d'inscription
mercredi 4 juin 2003
Statut
Membre
Dernière intervention
12 octobre 2004
-
merci pour la regle mathematique, mais est que tu penses vraiment que votre methode est la plus rapide?
peut etre qu'elle est plus courte mais elle n'est pas plus rapide. en effet, vous vaez utilisez une fonction (ln)
donc votre program va detrerminer des chifres apres la vergule qu'on en pas besoin. et ca prend du temps.
dans la majorites des program on peut toujours utiliser des fonctions predifinis mais le problem ce qu'ile ne sont pas toujours utils.
cs_Zeroc00l
Messages postés
370
Date d'inscription
lundi 1 avril 2002
Statut
Membre
Dernière intervention
11 février 2010
-
Oui...
Mais ça utilise moins de mémoire (pour de pas dire aucune !) et deuxio question vitesse je ne sais pas ... pour de grande puissance tu fais pas mal de divisions ...
de toute facon pour les puissances de 2 vive le C (ou l'assembleur).