Adloun

On voudrait remplacer nb bits(n) par floor(log2(n)) + 1 , qui semble…

Exercice de TD · niveau 2 · NSI (première), chapitre 1 — Représenter les entiers · Combien de bits faut-il ?

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

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.