Adloun

Hors programme. À l'aide du module struct , afficher les 64 bits qui…

Exercice supplémentaire · niveau 2 · NSI (première), chapitre 2 — Flottants, booléens et textes · Sous le capot des flottants

Énoncé

Hors programme. À l'aide du module struct, afficher les bits qui codent un flottant, découpés en signe, exposant et mantisse. L'appliquer à , et , et retrouver dans le troisième la période 0011 du cours.

Corrigé


import struct


def bits64(x):
    """Les 64 bits IEEE-754 de x : 1 signe, 11 exposant, 52 mantisse.

    Precondition : x est un flottant. struct.pack le convertit en 8
    octets ('>d'), unpack les relit comme un entier ('>Q') que l'on
    affiche en binaire sur 64 rangs.
    """
    (n,) = struct.unpack(">Q", struct.pack(">d", x))
    b = format(n, "064b")
    return b[0], b[1:12], b[12:]

>>> bits64(1.0)
('0', '01111111111', '0000...0000')
>>> bits64(0.5)
('0', '01111111110', '0000...0000')
>>> bits64(0.1)
('0', '01111111011', '100110011001...10011010')

L'exposant est décalé. On lit pour : la norme stocke pour pouvoir coder des exposants négatifs sans bit de signe supplémentaire. Donc a l'exposant , l'exposant (), et l'exposant ().

La mantisse de , c'est le cours. On y lit 1001100110011…, soit le motif 0011 répété — décalé, parce que le premier significatif a été amené juste avant la virgule (c'est la normalisation, et ce n'est même pas stocké : il est implicite). Et l'on voit la fin de l'histoire : les bits s'achèvent par …10011010, un 10 au lieu du 0011 attendu. C'est l'arrondi, visible à l'oeil nu — la cause de tout ce chapitre.

Prolongement : bits de mantisse (52 stockés + 1 implicite) donnent chiffres décimaux significatifs. C'est l'ordre de grandeur annoncé par le cours, et il se calcule.

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.