2010-05-31 92 views
48

Estoy buscando una biblioteca gratuita de punto fijo C++ (Principalmente para usar con dispositivos integrados, no para cálculos de precisión arbitrarios). Básicamente, los requisitos son:C++ biblioteca de punto fijo?

  • Sin sobrecarga de tiempo de ejecución innecesario: cualquier cosa que se pueda hacer en tiempo de compilación, debe hacerse en tiempo de compilación.
  • Posibilidad de cambiar el código de manera transparente entre punto fijo y punto flotante, sin sobrecarga inherente.
  • Funciones matemáticas de punto fijo. No tiene mucho sentido utilizar un punto fijo si necesita lanzar hacia adelante y hacia atrás para tomar una raíz cuadrada.
  • Tamaño pequeño.

¿Alguna sugerencia?

+0

Posible engaño: http://stackoverflow.com/questions/79677/whats-the-best-way-to-do-fixed-point-math –

+6

@Pavel: Gracias. Sin embargo, mi pregunta no es cómo implementar matemáticas de punto fijo. Lo escribiría yo mismo si tuviera que hacerlo, pero estoy tratando de evitar escribir todo el código repetitivo. Es por eso que estoy pidiendo una solución preparada. Además, no encontré ninguna referencia a las funciones matemáticas de punto fijo en otras publicaciones similares en SO. – uj2

+2

No llamaría a las bibliotecas de matemáticas "repetitivo". –

Respuesta

-3

Quizás podría probar las bibliotecas GMP o MPFR. Estoy bastante seguro de que satisfarán tus necesidades de rendimiento, pero tal vez sean demasiado para tus necesidades y quieras algo más liviano. De todos modos, mira aquí:

GMP library

o aquí:

MPFR library

+0

Niza bibliotecas, buenas vinculaciones de C++. Pero ambos admiten solo grandes cantidades, racionales y grandes flotadores: no creo que ninguno admita el punto fijo. –

+0

Malo, pensé equivocadamente que quería decir punto "flotante". Debería leer la pregunta con más cuidado en el futuro. Lo siento. – PeterK

-3

no he utilizado alguna vez SPUC, pero los tipos de datos Descripción de las reclamaciones de punto fijo y algunas funciones matemáticas.

+2

Veo mención de "enteros de ancho fijo" en el sitio, pero no valores de punto fijo. ¿Puede indicarme la parte de punto fijo de la biblioteca? –

+0

@BrooksMoses: son lo mismo. El ancho fijo significa que puede especificar la ubicación del punto decimal, que luego permanece en esa posición fija a través de todas las matemáticas. – mtrw

+2

¿Estás seguro de eso? Estoy mirando el núcleo de su implementación de "entero fijo" en http://spuc.cvs.sourceforge.net/viewvc/spuc/spuc/generic/int_s.h?view=markup, y eso se ve como un implementación de enteros con anchos específicos a la izquierda del punto decimal (por lo que los bits restantes en el tipo subyacente "largo" simplemente están enmascarados), no de números de punto fijo. El punto revelador es que no hay escala en la multiplicación, como era de esperar si el punto decimal no estuviera en el extremo derecho del número. –

6

Hay un código abierto fijado proyecto de biblioteca matemática punto de que se puede encontrar siguiendo los enlaces a continuación:

Es una biblioteca C estática con una interfaz de clase C++ para usuarios de C++, implementa la siguiente funcionalidad: Trig. Funciones: sin, cos, tan, asin, acos, atan, atan2 saturada aritmético: sadd, ssub, smul, SDIV Otras funciones: sqrt, Exp

Sólo es compatible con 16.16 fixed-point datatype.

Es un proyecto de código abierto desarrollado activamente (en busca de desarrolladores interesados).

+3

¿por qué solo es compatible con Q16.16? entonces el valor máximo es 65536. No es suficiente para muchos casos. – javapowered

+0

16.16 es el más común, es poco probable que utilice más de 32 bits si está utilizando un punto fijo por razones de rendimiento (no conozco ningún microcontrolador de 64 bits). Existen otros formatos menores, como 24.8 u 8.24 y supongo que hay una gran cantidad de formatos extraños, pero si estás en la etapa de necesitarlos, probablemente solo necesites escribir el código a mano (como hago normalmente). – flatmush

+0

URL muerta ...... – Cuadue

1

Recibí un pequeño encabezado C++. Puede encontrarlo en sweet::Fixed. Simplemente defina typedef sweet :: Fixed MyFloat; y usarlo como cualquier otro valor flotante. O cámbialo por el tipo de flotador que quieras más tarde. La clase tiene dos valores de 64 bits. Uno para la parte entera y otra para la fracción.

Tengo un pequeño punto fijo C++ 11 clase encabezado impl en sweet.hpp llamado fixed.hpp. Utiliza 32 bits para ambas partes.

typedef float MyFloat;   // This will feel the same 
typedef sweet::Fixed MyFloat; // like this 
5

Eche un vistazo a las siguientes dos buenas implementaciones sobre el manejo de la representación de punto fijo en C++ (no se necesitan libs externas).

  1. Fixed-Point-Class de Peter Schregle. También implementa eficientemente las operaciones básicas como además, multiplicación y división.

    ejemplo Código:

    #include <fixed_point.h> 
    using namespace fpml; 
    
    main() 
    { 
        fixed_point<int, 16> a = 256; 
        fixed_point<int, 16> b = sqrt(a); 
    } 
    
  2. Implementing Fixed-Point Numbers in C++ por Khuram Ali.

1

Aquí se presenta una biblioteca de código abierto de punto fijo en GitHub:

https://github.com/mbedded-ninja/MFixedPoint

Es compatible con números de 32 bits y 64 bits de punto fijo (con un cociente arbitrario) y a la vez rápido (todo está modelado, pero un poco más manual) y números lentos de punto fijo (más automático, pero más lento).

Está orientado a plataformas integradas, sin embargo lo he usado tanto en microcontroladores como en Linux sin ningún problema.

Cuestiones relacionadas