Souvent, nous utilisons des microcontrôleurs pour faire des choses dans nos robots, mais nous devons faire des calculs en décimal. L'utilisation de variables à virgule flottante est très lente, car une bibliothèque logicielle de virgule flottante est automatiquement incluse (sauf si vous avez un microcontrôleur haut de gamme). Par conséquent, nous utilisons généralement l'arithmétique à virgule fixe.
Chaque fois que je fais cela, j'utilise simplement un entier et je me souviens où se trouve la décimale. Cependant, il prend un certain soin pour s'assurer que tout est cohérent, en particulier lorsque les calculs impliquent des variables où le point décimal est à un endroit différent.
J'ai implémenté une fonction atan2 à virgule fixe, mais comme j'essayais de presser chaque dernière goutte de précision limitée (16 bits), je changeais souvent la définition de l'endroit où se trouve le point décimal, et cela changerait au fur et à mesure que je le peaufinais. De plus, j'aurais certaines constantes, comme une table de quasi-recherche, qui elles-mêmes ont un point décimal implicite quelque part.
Je veux savoir s'il y a une meilleure façon. Existe-t-il une bibliothèque ou un ensemble de macros qui peuvent simplifier l'utilisation des variables à virgule fixe, facilitant la multiplication et la division entre les variables mixtes, et permettant la déclaration de nombres décimaux ou d'expressions constantes, mais convertissant automatiquement la représentation en virgule fixe souhaitée lors de la compilation temps?
la source
Réponses:
Ce serait bien si nous pouvions dire au compilateur la plage et la précision de chaque variable d'entrée à virgule fixe (peut-être pas deux ayant le point de radix au même endroit), et il utiliserait automatiquement - au moment de la compilation - la plage correcte et des opérations de précision et de redimensionnement pour les valeurs intermédiaires et les valeurs finales dans une série de calculs. J'ai entendu des rumeurs selon lesquelles il serait possible de le faire dans le langage de programmation Ada ou dans les modèles C ++.
Hélas, le plus proche que j'ai vu est les bibliothèques arithmétiques à virgule fixe qui vous obligent, le programmeur, à choisir manuellement la représentation correcte et à vérifier manuellement que chaque opération conserve une plage et une précision adéquates. Parfois, ils facilitent la multiplication et la division entre les variables mixtes. Tel que:
la source
J'ai utilisé la bibliothèque TI IQMath pour implémenter des virgules flottantes virtuelles sur leurs DSP à virgule fixe.
Cela utilise des éléments spécifiques à TI, mais j'ai également utilisé ce code comme base pour implémenter des mathématiques virtuelles à virgule flottante sur d'autres microcontrôleurs. Il faut un peu de travail pour mettre en communication, mais c'est beaucoup plus facile que de partir de zéro.
la source
Il existe un certain nombre d'implémentations (pas de bibliothèques que je connaisse immédiatement) de la mise à l'échelle binaire (aka B-scaling)
En cela, vous gardez une note mentale (ou encore mieux, documentez le code ...) de l'endroit où se trouve le point décimal, en utilisant des décalages pour déplacer le point décimal vers le haut ou vers le bas.
J'ai utilisé la mise à l'échelle B dans l'assembleur sur des projets de défense, même sur les plus petits processeurs, donc je peux garantir sa pertinence pour autre chose ...
la source
Si vous utilisez un entier pour vous rappeler où se trouve le «point», ils utilisent en quelque sorte l' arithmétique à virgule flottante. Point fixe, a vraiment un point fixe .
atan
cos
Cela dépend de la plage de valeurs dont votre application a besoin, mais vous souhaiterez peut-être passer complètement à une représentation à point fixe. C'est, par exemple, au lieu de garder un nombre comme celui-ci:
où
number
est le nombre entier etdecimal_point
indique où se trouve le point décimal, vous pouvez le stocker comme ceci:où le nombre entier est
integer.fraction
, qui a la même utilisation de la mémoire, une plage de valeurs plus élevée et en général plus simple à utiliser.la source
#define
, non? Je pensais que vous le stockiez réellement et qu'il pouvait varier en fonction de la taille de votre numéro.