A menudo usamos microcontroladores para hacer cosas en nuestros robots, pero necesitamos hacer algunos cálculos en decimal. El uso de variables de punto flotante es muy lento, ya que se incluye automáticamente una biblioteca de punto flotante de software (a menos que tenga un microcontrolador de gama alta). Por lo tanto, generalmente usamos aritmética de punto fijo.
Cada vez que hago esto, solo uso un número entero y recuerdo dónde está el lugar decimal. Sin embargo, se debe asegurar que todo sea consistente, especialmente cuando los cálculos involucran variables donde el punto decimal está en un lugar diferente.
He implementado una función de punto fijo atan2, pero debido a que estaba tratando de exprimir hasta la última gota de precisión limitada (16 bits), a menudo cambiaba la definición de dónde está el punto decimal, y cambiaba a medida que lo ajustaba. Además, tendría algunas constantes, como una tabla de cuasi búsqueda, que tienen un punto decimal implícito en alguna parte.
Quiero saber si hay una mejor manera. ¿Existe una biblioteca, o conjunto de macros, que pueda simplificar el uso de variables de punto fijo, facilitando la multiplicación y división entre variables mixtas y permitiendo la declaración de números decimales o expresiones constantes, pero convirtiendo automáticamente a la representación de punto fijo deseada en la compilación ¿hora?
fuente
Respuestas:
Sería bueno si pudiéramos decirle al compilador el rango y la precisión de cada variable de entrada de punto fijo (tal vez no hay dos que tengan el punto de radix en la misma ubicación), y usaría automáticamente el rango correcto en tiempo de compilación. y operaciones de precisión y reescalado para los valores intermedios y valores finales en una serie de cálculos. He escuchado rumores de que puede ser posible hacerlo en el lenguaje de programación Ada o en plantillas C ++.
Por desgracia, lo más cercano que he visto son las bibliotecas aritméticas de punto fijo que requieren que usted, el programador, elija manualmente la representación correcta y verifique manualmente que cada operación mantenga un rango y precisión adecuados. A veces facilitan la multiplicación y la división entre variables mixtas. Como:
fuente
He usado la Biblioteca TI IQMath para implementar punto flotante virtual en sus DSP de punto fijo.
Eso usa algunas cosas específicas de TI, pero también he usado ese código como base para implementar matemáticas virtuales de punto flotante en otros microcontroladores. El puerto requiere un poco de trabajo, pero es mucho más fácil que comenzar desde cero.
fuente
Hay una serie de implementaciones (no hay bibliotecas de las que tenga conocimiento inmediato) de Binary Scaling (también conocido como B-scaling)
En esto, mantienes una nota mental (o incluso mejor, documenta el código ...) de dónde está el punto decimal, usando los cambios para mover el punto decimal hacia arriba o hacia abajo.
He utilizado la escala B en ensamblador en proyectos de defensa, incluso en las CPU más pequeñas, por lo que puedo garantizar su idoneidad para cualquier otra cosa ...
fuente
Si utiliza un número entero de recordar dónde el "punto" es, ellos son la clase de uso de la aritmética de coma flotante. Punto fijo, realmente tiene punto fijo .
Sospecho que para cada función habrá un "preprocesamiento" diferente para que su número de punto "flotante" sea adecuado para la función. Por ejemplo, paraπ −π
atan
, desearía cambiar el número para que su punto decimal coincida con el de su función de punto fijo. Paracos
, es posible que desee obtenerlo en el rango de y y luego cambiarlo.- πEsto depende del rango de valores que necesita su aplicación, pero es posible que desee moverse por completo a una representación de punto fijo. Es decir, por ejemplo, en lugar de mantener un número como este:
donde
number
está el número entero ydecimal_point
dice dónde está el punto decimal, puedes almacenarlo así:donde está el número entero
integer.fraction
, que tiene el mismo uso de memoria, mayor rango de valores y, en general, más simple de usar.fuente
#define
, ¿verdad? Pensé que realmente lo almacenabas y puede variar según cuán grande o pequeño sea tu número.