• # Codage des floats

    Posté par . En réponse au journal Bug PHP?. Évalué à 4.

    Un entier, c'est codé en binaire
    0b => 0d
    1b=> 1d
    10b => 2d
    etc....
    et un nombre se décompose sur les puissances de 2
    18 = 0*1 + 1*2^1 + 0*2^2 + 0*2^3 + 1*2^4 = 10010b


    Quand tu code un flottant, la partie après la virgule est aussi codée en binaire en décomposant par puissance négative de 2
    a*1/2^1 + b*1/2^2 +c*1/2^3 + ... + x*1/2^n

    Un nombre comme 1/3 a un nombre de virgule infini. Donc on ne pourra jamais trouver un "décomposition en série de 1/2^n" finie égale à 1/3. Un float est stocké sur un nombre fini de bits et donc s'approchera plus ou moins bien de ton 1/3 mais n'y arrivera jamais exactement.

    Conclusion quand tu réaffiche ton nombre, il affiche la valeur stockée.
    Ex : 0.8126 si on a que 4bits de précisions
    0.826 = 1/2 + 1/4 + 0/8 +1/16 (+1/10000)

    La partie 1/10000 n'est pas codable avec notre système, quand on réaffichera notre nombre stocké, on aura 0.825 et non 0.826