Calculs flottants

In [ ]:
%load_ext tutormagic

Question 1

Que va afficher ce code ? Faites le calcul sans l'exécuter.

s = 0
x = 0.1
while x != 1:
    s = s + x
    x = x + 0.1
print(s)

Question 2

Exécuter le code ci-dessus pour vérifier votre calcul.

Si rien ne s'affiche, appuyer deux fois sur la touche I pour interrompre l'interpréteur Python et rechercher la cause.

In [ ]:
s = 0
x = 0.1
while x != 1:
    s = s + x
    x = x + 0.1
print(s)

Question 3

Ajouter la commande magique %%tutor -t avant le code afin de l'exécuter pas à pas dans PythonTutor. Que constatez-vous ?

In [ ]:
 

Question 4

Modifier le code en remplaçant le test x != 1 par x < 1. Que constatez-vous ?

In [ ]:
 

Question 5

Calculer $0.1 + 0.1 + 0.1$. Commentez.

In [ ]:
 

Les flottants IEEE 754

Une valeur de type float est codé sur 64 bits. Le nombre de réels représentables par un float est donc majoré par $2^{64}$.

La norme IEEE 754 spécifie les règles de codage. Le mot de 64 bits est divisé en trois parties :

  • bits 0-51 : La mantisse qui code les chiffres significatifs.
  • bits 52-62 : L'exposant qui code l'ordre de grandeur.
  • bit 63 : Le signe du flottant.

Codage IEEE 754

Les flottants sont les réels de la forme $\pm a\times 2^p$ :

  • $a$ est codé par les bits de la mantisse,
  • $p$ est codé par les bits de l'exposant,
  • $\pm$ est codé par le bit de signe.

Question 6

Les nombres décimaux ne sont pas tous représentables par des flottants. Pour mémoriser un nombre décimal Python choisit de le représenter par le flottant le plus proche.

Parmi les réels ci-dessous, quels sont ceux qui ont une représentation flottante exacte :

$$ 0.1\quad 0.15\quad 0.2\quad 0.25\quad 0.4\quad 0.5\quad 0.625\quad 0.8$$

Résolution de $f(x)=0$ par dichotomie

Question 7

Écrire le code de la fonction solve.

In [ ]:
def solve(f, a, b, eps):
    """ Retourne une solution approchée à eps près
        d'une solution de f(x) = 0 sur l'intervalle [a, b].
        
        La fonction est supposée être continue et telle que
        f(a) * f(b) <= 0
    """
    ### À COMPLÉTER

Question 8

Indiquer les variables de boucle utilisées et leur signification. Donner un invariant de boucle satisfait par votre code.

Question 9

Au début de chaque itération on a

$$u\leq v\quad\text{et}\quad f(u)\times f(v) \leq 0\quad\quad (P)$$

Question 10

Montrer que le code de votre fonction solve est correct.