NSI (première) · Chapitre 1 · Exercice de TD
On voudrait remplacer nb bits(n) par floor(log2(n)) + 1 , qui semble…
Représenter les entiers · Combien de bits faut-il ? · niveau 2
Énoncé
On voudrait remplacer nb_bits(n) par floor(log2(n)) + 1, qui semble plus direct. Comparer les deux sur les entiers de à , puis chercher un entier pour lequel la formule échoue. (Chercher du côté de pour grand.)
Corrigé
Sur les petites valeurs, les deux coïncident : la boucle de nb_bits et len(vers_base(n, 2)) donnent le même résultat pour tous les testés.
L'échec. math.log2 calcule en flottant, sur un nombre fixe de bits de mantisse. Pour , l'arrondi rend tout rond, au lieu d'une valeur légèrement inférieure à :
import math
n = 2**49 - 1
print(math.log2(n)) # 49.0
print(math.floor(math.log2(n)) + 1) # 50 -> FAUX
print(nb_bits(n)) # 49 -> juste
Le plus petit contre-exemple de cette forme est .
Ce qu'il faut en retenir. nb_bits n'emploie que des divisions entières : elle est exacte pour tout , aussi grand soit-il. La formule logarithmique passe par les flottants, et les flottants approchent — c'est le sujet du chapitre suivant. Une fonction exacte et lente vaut mieux qu'une fonction rapide et fausse.
Piège : tester sur mille petites valeurs et conclure que c'est correct. Un jeu de tests ne prouve rien s'il ne contient pas les cas limites (chapitre 3).
100 % gratuit
Essaie le suivant avec le tuteur
- L'exercice suivant avec le tuteur, sans compte : il guide pas à pas, sans donner la réponse
- 16 autres exercices corrigés dans ce chapitre, et 20 à chercher avec le tuteur
- Le podcast et la vidéo du chapitre et la correction filmée du TD : 2 minutes sans compte
Sans compte : le cours, 2 minutes de podcast et de vidéo et un exercice avec le tuteur. Pour tout le reste : inscription gratuite en 30 secondes, sans carte bancaire.