Question

J'utilise actuellement Library point fixe de Microchip, mais je pense que cela vaut pour la plupart des bibliothèques de points fixes. Il prend en charge Q15 et Q15.16 types, respectivement de 16 bits et de données de 32 bits.

Une chose que je remarque est qu'il ne comprend pas ajouter, soustraire, multiplier ou diviser les fonctions.

Comment dois-je faire cela? Est-ce aussi simple que l'ajout / soustraction / multiplication / les divisant ensemble en utilisant les mathématiques entier? Je peux voir plus et travail de soustraction, mais multiplication ou la division ne prendrait pas en charge la partie fractionnaire ...?

Était-ce utile?

La solution 2

Il se trouve que toutes les fonctions arithmétiques de base sont effectuées à l'aide des opérateurs natifs en raison de la façon dont les chiffres sont représentés. par exemple. fracture utilise le / opérateur et multiplier l'opérateur *, et ceux-ci à la compilation se divise et se multiplie simples 32 bits.

Autres conseils

La bibliothèque Microsoft comprend des fonctions pour additionner et soustraire qui traitent avec trop-plein underflow / (_Q15add et _Q15sub).

multiplicatrice être mis en œuvre une fonction d'assemblage (je pense que le code est bon - ce qui est de la mémoire).

C prototype appelant est:

extern _Q15 Q15mpy(_Q15 a, _Q15 b);

La routine (placé dans un fichier source .s dans votre projet) est:

.global _Q15mpy
_Q15mpy:
mul.ss w0, w1, w2        ; signed multiple parameters, result in w2:w3
SL w2, w2            ; place most significant bit of W2 in carry
RLC w3, w0           ; rotate left carry into w3; result in W0
return                        ; return value in W0

.end

Rappelez-vous d'inclure libq.h

Cette routine fait un décalage vers la gauche d'un bit plutôt que d'un décalage vers la droite de 15 bits sur le résultat. Il n'y a pas de problèmes de débordement parce que les numéros Q15 ont toujours une magnitude <= 1.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top