• [^] # Re: Petit résumé et tests dans la réalité

    Posté par (site web personnel) . En réponse au journal [Humour] vers un monde différent. Évalué à 1.

    En attendant que le prof m'explique comment il fait un addition ou une multiplication sur un float... Et en une seule opération

    Tu sais ce que c'est un pipeline ?
    C'est ça https://fr.wikipedia.org/wiki/Pipeline_(architecture_des_processeurs)
    Il y a plusieurs instructions traitées séparément dans le même cycle d'horloge. C'est comme ça que la FPU arrive à traiter sa mantisse, son exposant, son bit de signe, et les éventuelles exceptions levées par NaN en seulement deux cycles de la FPU.

    (Au passage je vais me répéter: un calcul sur décimal est équivalent à un calcul d'entier avec un poil de glue.

    C'est là qu'il te manque des maths !

    Car si tu dois additionner, tu vas devoir réimplémenter ce que fait IEEE754, mais, là, tu n'as pas de pipeline et en plus tu fais tout en base 10 (donc les multiplications ne sont pas juste des shifts right ou left mais coûtent très cher (6 cycles minimum donc 6 fois plus qu'un décalage) et tu dois vérifier que ça déborde pas, donc faire des soustractions et regarder le bit de signe du résultat etc.

    Du coup ça donne le code du module decimal que j'ai collé concernant l'addition. On comprend alors que ta glue, elle coûte au moins largement 100 cycles (et encore ça c'est si fait de façon optimale). Ce n'est pas un problème d'implémentation car il y a des coûts incompressibles.

    Et de toute façon, au final, tu auras le même problème qu'avec les binaires mais en base 10 comme je l'ai montré avec le code utilisant decimal concernant la division par 3. Il se plante tout autant que les floats. Tu peux le tester toi même.

    Tu peux aussi tester ça

    from decimal import Decimal
    a=decimal('0.000375')
    s=decimal('0')
    for i in range (1000000):
     s += a

    et comparer avec

    from decimal import Decimal
    a=0.000375
    s=0
    for i in range (1000000):
     s += a

    Tu obtiendras

    14:05:05 ~/Téléchargements: time python bench_dec.py 
    real 0m10,239s
    user 0m11,388s
    sys 0m0,006s
    14:05:45 ~/Téléchargements: time python bench_float.py 
    real 0m0,142s
    user 0m0,161s
    sys 0m0,007s

    Soit une division des perfs par plus de 70. Mais bon, encore une fois, c'était totalement prévisible par .... les maths :)

    Voilà monsieur. Avec tout mon respect.