PolluxLe 29/10/2007 à 18:18
- la partie fractionnaire de x est xfrac = (float)(x%256)/256
- on veut calculer xfrac1000 = (int)(xfrac*1000)
- on veut éviter d'utiliser les float : donc on fait passer la multiplication avant la division pour que la division ne supprime pas d'information utile
- ça donne xfrac1000 = ((x%256)*1000)/256
- seulement y a un gros risque d'overflow quand on multiplie par 1000 : x%256 peut valoir jusqu'à 255, donc l'idéal ce serait de multiplier par un nombre plus petit que 256, comme ça on a juste une multiplication 16 bits
- coup de bol 1000 = 8*125, et 8 est une puissance de 2
- donc on peut écrire xfrac1000 = ((x%256)*125*8)/256 = ((x%256)*125<<3)>>8
- et on peut éliminer l'overflow en transformant le décalage à gauche par 3 puis à droite par 8 en un seul décalage à droite par 8-3
- finalement xfrac1000 = (x%256)*125>>(8-3)