LES PUISSANCES DE 2 QUI ENTOURENT UN NOMBRE

cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010 - 2 mars 2004 à 13:00
cs_Zeroc00l Messages postés 367 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

cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
11 févr. 2005 à 02:32
grandvizir : Où est le problème ?

Imaginons que je veuille encadrer PI :
Et bien il est entre :
Valeur_Entiere_de(PI* 10^p) / (10^p)
et
Valeur_Entiere_de(PI* 10^p + 1) / (10^p)
avec p dans l'ensemble N (et PI une valeur machine dont tjrs < à la "vrai" valeur"

Ensuite a toi de simplifier la fraction ...
Donc aucune difficulté !
Par contre j'aimerais bien savoir comment calculer les decimale de PI, cad connaitre l' "algo" qui permet de les calculer... Ca, ça m'interesserais bcp !
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
9 févr. 2005 à 19:53
La fonction LN n'est qu'un simple appel à une instruction en assembleur qui fait travailler seulement le coprocesseur arithmétique (ce qui n'est pas le processeur).

C'est bien plus rapide que de faire des boucles, car je connais un circuit électronique qui s'en fout royalement.

Il aurait été plus sympathique de faire un programme qui entoure d'une fraction un nombre irrationnel ou presque (car il y aura tjs des approximations avec les nombres flottants appilqués aux irrationnels). N'oublions pas que l'ensemble des rationnels est aussi dense que l'ensemble des réels. D'où la possibilité d'effectuer un encadrement.

On peut toujours utiliser la dichotomie si l'on veut, mais au final, le prog est faiblement intéressant et le logarithme de Zero00l met fin à toute discussion.
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
12 oct. 2004 à 20:38
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).
cs_peecota Messages postés 2 Date d'inscription mercredi 4 juin 2003 Statut Membre Dernière intervention 12 octobre 2004
12 oct. 2004 à 13:55
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 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
2 mars 2004 à 13:47
* 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_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
2 mars 2004 à 13:45
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 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
2 mars 2004 à 13:00
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
Rejoignez-nous