DIY FP: implementación de matemática de punto flotante en un microcontrolador sin una FPU de hardware

8

Estoy trabajando en un pequeño proyecto personal (dirigido a una hélice Parallax, pero esto debería ser bastante generalizable) que necesita matemática de punto flotante.

El microcontrolador con el que estoy trabajando no tiene punto flotante nativo, o una biblioteca de punto flotante.

¿Hay buenos recursos o tutoriales sobre la implementación de software de punto flotante matemático? Preferiblemente con recursos realmente limitados (¡ni siquiera tengo una pila!).


Me gustaría apoyar doubleflotadores de tamaño. La hélice es una MCU de 32 bits, por lo que tendré que usar múltiples variables para cada flotante.

Sé que hay una biblioteca de punto flotante de software para la hélice, pero solo admite singleflotadores de tamaño.

No, probablemente no necesito doubleflotadores de tamaño, pero esto parece un proyecto realmente interesante. La mitad de la razón por la que quiero hacer esto es porque aprenderé mucho en el camino.

Connor Wolf
fuente
que compilador Puede que me haya perdido, pero no veo qué idioma está utilizando.
Kortuk
@Kortuk: estoy apuntando personalmente a una hélice Parallax, por lo que será Spin o asm. Sin embargo, creo que esto no debería ser demasiado específico del idioma. Suponga que tengo las operaciones comunes (+ - / * desplazamiento de bits, bit a bit y / o / etc.).
Connor Wolf el
¿Qué operaciones necesitas implementar? Si solo desea sumar, restar y multiplicar, y no está demasiado preocupado por los casos límite, NaN, etc., entonces debería ser bastante trivial implementar esto. Lo he hecho para microcontroladores de 8 bits en el pasado y no es una tarea gigantesca, incluso si lo haces todo de forma asm.
Paul R
1
Bueno, como dices, aprenderás mucho sobre la implementación de operaciones de punto flotante en el camino.
Paul R
3
Quizás no necesites coma flotante . Si solo necesita números fraccionarios, también puede hacer aritmética de punto fijo con punto decimal (binario real) desplazado en algunos lugares a la izquierda. ¿Puedes decir más sobre tu aplicación?
Cuajada

Respuestas:

4

Si quieres hacerlo tú mismo, yo diría que solo lo hagas.

Supongo que no encontrarás demasiados recursos o tutoriales porque no hay mucho.

Aquí hay un resumen:

  • suma / resta:
    si los exponentes difieren demasiado (más de lo que la mantisa tiene bits):
    solo devuelve el valor con un exponente más grande (si este es el sustraendo: negar)

    si los exponentes son similares:
    desplazar la mantisa de menor valor por la diferencia de exponentes y sumar / restar de otra mantisa (usando aritmética de punto fijo)
    si el resultado no es 0: desplazar la mantisa hasta MSBit del resultado es 1 y disminuir el exponente la misma cantidad

  • multiplicación / división:
    multiplica / divide mantisas (usando aritmética de punto fijo) y suma / resta exponentes

Cuajada
fuente
2

Debería poder utilizar esta biblioteca de punto flotante de precisión múltiple en la hélice, con Catalina C o gcc. Sin embargo, puede ser demasiado lento para muchas aplicaciones.

Leon Heller
fuente
¿Puede el código C en la hélice interoperar con Spin o prop-asm? Si no, podría intentar traducirlo para que gire. Afortunadamente, no necesito mucha velocidad. Siendo realistas, necesito hacer 7 operaciones, a 2 hz.
Connor Wolf el
2
Oh chico, la fuente sola es 1.1 MB, comprimida . Creo que es un poco exagerado. ¿Hay alguna opción más simple?
Connor Wolf el
2
Más importante aún, esta biblioteca (1) trata sobre punto flotante de precisión arbitraria (no de tamaño nativo como 32 bits y 64 bits) y (2) apunta a compiladores Linux en procesadores Intel, AMD y MIPS i386 y x64. Hay una mención de 'brazo' y 'genérico' en las carpetas de origen, pero no comenzaría aquí.
Kevin Vermeer
2

Parece que esta pregunta ha adquirido la inclinación de buscar la comprensión más que resolver el problema, por lo que esta puede no ser la respuesta más útil, sino solo por ser completa

http://code.google.com/p/propgcc/wiki/PropGccCompileOptions

Implica que la versión de hélice de GCC tiene soporte de coma flotante, incluidos los dobles.

GCC y sus bibliotecas compiladoras son, por supuesto, de código abierto, aunque puede haber una curva de aprendizaje real antes de que pueda comenzar a ver qué está haciendo el código.

Chris Stratton
fuente