J'essaie de multiplier A*B
par un point fixe de 16 bits, tout en conservant la plus grande précision possible. A
est 16 bits dans la plage d'entiers non signés, B
est divisé par 1000 et toujours entre 0.001
et 9.999
. Cela fait un moment que je traite de problèmes comme ça, donc:Multiplication à virgule fixe dans une plage connue
- Je sais que je peux faire
A*B/1000
après le déplacement des variables 32 bits, bande retour à 16 bits - Je voudrais rendre plus rapide que celle
- Je voudrais faire toutes les opérations sans passer à 32 bits (depuis que j'ai multiplication 16 bits uniquement)
est-il un moyen facile de le faire?
Éditer: A
sera entre 0 et 4000, de sorte que tous les résultats possibles sont également dans la plage de 16 bits.
Modifier: B
vient de l'utilisateur, définir chiffre par chiffre dans le masque X.XXX
, c'est pourquoi l'opération est /1000
.
Avez-vous une division entière non signée de 16 bits? Ou division d'un entier non signé de 32 bits par un entier non signé de 16 bits? –
Ne pouvez-vous pas simplement convertir A en un de vos types à virgule fixe, puis multiplier? Ou est-A hors de portée? – George
@George: à première vue, A est dans la gamme 0..65535, bien en dehors de la plage de B. –