Adloun

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

Faire l'exercice suivant avec le tuteur

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.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant avec le tuteur →