Doraki a écrit:Meme s'il y a une division tu ne devrais pas avoir besoin de flottants vu que tous les résultats sont entiers.
L'ordinateur ne sait pas que le résultat est entier au moment où il fait l'opération (ni même à la fin).
J'ai écrit les 3 versions (en scheme, c'est bien le scheme) : (a) avec récursion double, (b) avec calcul itératif, (c) avec récursion simple mais des fractions. Pour les petites valeurs (b) et (c) renvoient pareil (et (a) aussi mais il met plus longtemps) sauf que le résultat donné par (c) est considéré comme un flottant (1144066.0 et pas 1144066), mais pour les grandes valeurs (b) renvoie le résultat exact et pas (c), par exemple avec
(b) renvoie 770746561468507650149628192324 et (c) renvoie 7.70746561468508e29 (et (a) n'est pas près d'avoir terminé). (c) est un peu plus rapide que (b) pour les grandes valeurs mais c'est au prix de l'exactitude du résultat (si les calculs étaient exacts il serait probablement plus lent que (b), les divisions et produits coûtent beaucoup plus cher que les sommes).
Edit: et la différence entre (b) et (c) n'est pas juste au niveau des arrondis, avec
on a :
(b) 353600757093566136507612787110853036794237151113912561824416144510382925290233544323102871009782289037916748152467480
(c) 3.5360075709356655e116
ça fait quand même une erreur de l'ordre de 10 puissance 101.